2014-10-21 3 views
5

Если я создаю обещание, используя $ интервала, это отменяемый См: http://jsbin.com/jeweke/2/

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

Однако, если я цепь обещания, возвращаемое обещание не отменяемое , См: http://jsbin.com/jeweke/1/

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

Что дает? Это то, как он должен работать?

Примечание - пример здесь свободно адаптировано из http://jsfiddle.net/ExpertSystem/fZc3W/

ответ

6

Это происходит потому, что результат посыла цепи от $interval не имеет свойство, содержащее идентификатор интервала ($$intervalId). В первом случае вы сохраняете обещание таймера, у которого есть $intervalId, во втором случае вы сохраняете обещание, возвращенное из цепочки, которая является необработанным обещанием q без свойства $intervalId (который является настраиваемым свойством, добавленным в обещание хранить соответствующие setInterval , когда вы звоните $interval(...). Когда вы отменяете таймер, ему требуется $intervalId для отменыInterval и отклонения соответствующего обещания таймера.

Это то, что interval.cancel делает

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; 
    }; 

Обратите внимание на строку: -

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

intervals нет ничего, кроме карты intervalId и его соответствующее обещание (например: - {1:promiseOfInterval1, 2:promiseOfInterval2}), так что без intervalId не отменяется. Короче говоря, обещание, возвращаемое интервалом $, - это q обещание плюс свойство $ intervalId, и когда вы его целенаправленно, это просто реализация $q, которая возвращает обратно обещание нового отложенного объекта.

+0

Отличное объяснение. спасибо за рытье в источник. – RoyM

+0

@roymath Добро пожаловать ... :) – PSL

Смежные вопросы