Angularjs $q.defer()
promise对象接收通知回调,当我们提供多个时,它会保留并通知所有这些,即它不会覆盖旧版本。
var def=$q.defer();
def.promise.then(null, null, callback1);
def.promise.then(null, null, callback2);
然后,如果我想删除(取消注册),例如callback2
,我该怎么办?
这是实例:
答案 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);