繁体   English   中英

如何从angularjs的$ q.defer()promise对象中删除回调

[英]how can I remove a callback from $q.defer() promise object of angularjs

Angularjs $q.defer() promise对象接收通知回调,当我们给出多个时,它会保留并通知所有这些,即它不会覆盖旧版本。

var def=$q.defer();
def.promise.then(null, null, callback1);
def.promise.then(null, null, callback2);

然后,如果我想删除(取消注册),例如, callback2 ,我该怎么办?

这是现场的例子:

的jsfiddle

快速查看$ q的来源向我们展示:

then: function(onFulfilled, onRejected, progressBack) {
  var result = new Deferred();

  this.$$state.pending = this.$$state.pending || [];
  this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);
  if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);

  return result.promise;
}

因此,没有特定的标识符指向您在$$state.pending堆栈中的匿名回调以便将其拼接出来。

我以前没有亲自试过这个,但是如果你想擦除挂起的堆栈,可能是def.$$state.pending = []; 会做的伎俩。 然后你可以简单地重新分配你想要的def.then()回调。

Promise用于创建一系列异步进程。 一旦设置了此序列的一个步骤,就不可能(至少以优雅的方式)取消它。

如果我错了,请纠正我,但这就是你要在这里做的事情:你用callback2设置一步,然后你尝试删除那一步。 相反,我建议仅在满足某个条件时才设置callback2,例如:

var notifCallback;
if (true) {
    notifCallback = function(notif) {
        console.log('notify 1', notif);
    };
} else {
    notifCallback = function(notif) {
        console.log('notify 2', notif);
    };
}

def.promise.then(null, null, notifCallback);

关于jsFidle的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM