gpt4 book ai didi

angularjs - 无法取消 $interval 返回的链式 promise

转载 作者:行者123 更新时间:2023-12-04 18:40:53 26 4
gpt4 key购买 nike

如果我使用 $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);}
);

但是,如果我将 promise 链接起来,则返回的 promise 是不可取消的。
见: 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 ,这是一个没有 $intervalId 的原始 q promise 。属性(这是在您调用 setInterval 时存储各自的 $interval(... 的 id 的 promise 中添加的自定义属性)。当您取消计时器时,它需要 $intervalId取消间隔并拒绝相应的计时器 promise 。

这是什么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 及其各自 promise 的映射(例如:- {1:promiseOfInterval1, 2:promiseOfInterval2} ),因此没有 intervalId 不会发生取消。所以简而言之,$interval 返回的 promise 是 q promise 加上 $intervalId 属性,当你将它彻底链接起来时,它只是 $q返回一个新的延迟对象的 promise 的实现。

关于angularjs - 无法取消 $interval 返回的链式 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com