angularjs – 无法取消$interval返回的链式承诺
发布时间:2020-12-17 17:40:55 所属栏目:安全 来源:网络整理
导读:如果我使用$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);}); 但是,如果我将承诺
如果我使用$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);} ); 但是,如果我将承诺链接起来,则返回的承诺不可取消. timer = $interval(intervalFunc,10) .then( function(res) {console.log('ok',err);} ); 是什么赋予了?这是它应该如何工作吗? 注意 – 此处的示例从http://jsfiddle.net/ExpertSystem/fZc3W/开始大量改编 解决方法
这是因为来自$interval的promise链的结果没有包含interval id($$intervalId)的属性.第一种情况是保存具有$intervalId的计时器保证,在第二种情况下,您保存从链返回的保证,这是一个没有$intervalId属性的原始q保证(这是在存储保证的承诺上添加的自定义属性)当你调用$interval(…)时各自的setInterval的id.当你取消定时器时,它需要$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) { interval只是intervalId及其各自promise的映射(例如: – {1:promiSEOfInterval1,2:promiSEOfInterval2}),所以没有intervalId就不会发生取消.所以简而言之,$interval返回的promise是q promise plus $intervalId属性,当你完全链接它时,它只是$q实现,它返回一个新的延迟对象的promise. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |