如果我使用$interval创建一个promise,它是可以取消的请参阅: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/
这是因为来自$interval
的promise链的结果不具有包含间隔id($$intervalId
)的属性。第一种情况是保存具有$intervalId
的定时器promise,第二种情况是存储从链返回的promise,该promise是不带$intervalId
属性的原始q promise(这是在promise上添加的自定义属性,用于在调用$interval(...
时存储相应的setInterval
的id)。当您取消计时器时,它需要$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就不会发生取消。简而言之,$interval返回的promise是q promise加$intervalId属性,当您将其完全链接时,它只是返回新的延迟对象的promise的$q
实现。