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

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

本文关键字:对象 promise 删除 回调 defer angularjs      更新时间:2023-09-26

Angularjs $q.defer() promise对象接收notify回调,当我们给出多个时,它会保留并通知所有的回调,也就是说它不会覆盖旧的回调。

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用于创建异步进程序列。一旦设置了这个序列的一个步骤,就不可能(至少以优雅的方式)取消它。

纠正我,如果我错了,但这就是你在这里要做的:你设置一个步骤与回调2,然后你试图删除该步骤。相反,我建议仅在满足特定条件时才设置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);