2014-10-21 17 views
5

Nếu tôi tạo ra một lời hứa sử dụng khoảng $, nó có thể hủy bỏ Xem: http://jsbin.com/jeweke/2/

timer = $interval(intervalFunc, intervalDelay, 10); 
timer.then(
    function(res) {console.log('ok', res);}, 
    function(err) {console.log('err', err);} 
); 

Tuy nhiên, nếu tôi chuỗi lời hứa, lời hứa trả lại là không hủy ngang . Xem: http://jsbin.com/jeweke/1/

timer = $interval(intervalFunc, intervalDelay, 10) 
.then(
    function(res) {console.log('ok', res);}, 
    function(err) {console.log('err', err);} 
); 

Điều gì mang lại? Đây có phải là cách nó hoạt động không?

Lưu ý - ví dụ ở đây là lỏng lẻo chuyển thể từ http://jsfiddle.net/ExpertSystem/fZc3W/

Trả lời

6

Đó là bởi vì kết quả của chuỗi lời hứa từ $interval không có tài sản, trong đó có id khoảng ($$intervalId). Trường hợp đầu tiên bạn đang lưu hẹn giờ hứa hẹn có số $intervalId, trong trường hợp thứ hai bạn đang lưu lời hứa trả lại từ chuỗi là lời hứa q thô mà không có thuộc tính $intervalId (là thuộc tính tùy chỉnh được thêm vào lời hứa lưu trữ setInterval tương ứng ID của bạn khi bạn gọi $interval(...). Khi bạn hủy hẹn giờ, cần $intervalId để hủyInterval và từ chối lời hứa hẹn giờ tương ứng.

Đây là những gì interval.cancel không

interval.cancel = function(promise) { 
     if (promise && promise.$$intervalId in intervals) { 
     intervals[promise.$$intervalId].reject('canceled'); 
     clearInterval(promise.$$intervalId); 
     delete intervals[promise.$$intervalId]; 
     return true; 
     } 
     return false; 
    }; 

Lưu ý dòng: -

if (promise && promise.$$intervalId in intervals) { 

intervals là gì, nhưng bản đồ về intervalId và hứa hẹn tương ứng của nó (ví dụ: - {1:promiseOfInterval1, 2:promiseOfInterval2}), vì vậy mà không intervalId không có hủy bỏ xảy ra. Vì vậy, trong ngắn hạn lời hứa trở lại bởi khoảng $ là q lời hứa cộng với $ intervalId tài sản và khi bạn chuỗi nó triệt để nó chỉ là thực hiện $q mà trả về một lời hứa của đối tượng trì hoãn mới.

+0

Giải thích tuyệt vời. cảm ơn vì đã đào sâu vào nguồn. – RoyM

+0

@roymath Bạn được chào đón ... :) – PSL

Các vấn đề liên quan