如果我使用$interval创建一个promise,它是可取消的
见: http://jsbin.com/jeweke/2/
见: 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,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.