无法取消$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, 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实现。

相关内容

  • 没有找到相关文章

最新更新