加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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);}
);

但是,如果我将承诺链接起来,则返回的承诺不可取消.
见: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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读