2014-10-21 30 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承诺链的结果没有包含间隔ID($$intervalId)的财产。第一种情况是您保存的计时器承诺中有$intervalId,第二种情况下您保存的是从原始q承诺返回的承诺,但不包含$intervalId属性(这是在承诺上添加的定制属性,用于存储各自的setInterval当您致电​​时,您的身份证号码)。当你取消定时器时,它需要$intervalId取消间隔并拒绝相应的定时器许诺。

这是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没有取消发生。所以简而言之,$ interval返回的promise是q promise和$ intervalId属性,当你彻底链接时,它只是$q实现,它返回一个新的延迟对象的promise。

+0

很好的解释。感谢您挖掘源代码。 – RoyM 2014-10-21 22:52:39

+0

@roymath不客气...... :) – PSL 2014-10-21 22:53:32