angularjs – 无法取消$interval返回的链式承诺

前端之家收集整理的这篇文章主要介绍了angularjs – 无法取消$interval返回的链式承诺前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我使用$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,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.

猜你在找的Angularjs相关文章