Angularjs中$q.defer()
的promise对象接收notify回调函数,当我们提供多个时,它会保存并通知所有这些回调函数,即不会覆盖掉先前的。
var def=$q.defer();
def.promise.then(null, null, callback1);
def.promise.then(null, null, callback2);
如果我想要移除(注销)例如callback2
,我该怎么做?
这里有一个实时的例子:
Angularjs中$q.defer()
的promise对象接收notify回调函数,当我们提供多个时,它会保存并通知所有这些回调函数,即不会覆盖掉先前的。
var def=$q.defer();
def.promise.then(null, null, callback1);
def.promise.then(null, null, callback2);
如果我想要移除(注销)例如callback2
,我该怎么做?
这里有一个实时的例子:
快速查看$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()
回调即可。
processQueue()
中 - 在那里它有一个故障保护for (var i = 0, ii = pending.length; i < ii; ++i)
,其中长度将为0。 - pierdevara承诺被用来执行一系列异步进程。一旦设置了这个序列的一步,就无法(至少不是以优雅的方式)取消它。
如果我错了,请纠正我,但这正是你在这里尝试做的:你使用回调函数2设置一个步骤,然后尝试删除该步骤。相反,我建议仅在满足某些条件时设置回调函数2,例如:
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);