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

时间:2015-08-08 22:35:17

标签: javascript angularjs

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

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

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

这是实例:

jsfiddle

2 个答案:

答案 0 :(得分:1)

快速查看$ source告诉我们:

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()回调即可。

答案 1 :(得分:1)

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

Example on jsFidle