解决承诺时的成功回调顺序
Order of success callbacks when promise is resolved
当有一段代码依赖于其他承诺准备的数据时,我是否必须创建额外的辅助承诺:
var dfd1,dfd2;
dfd1 = $q.defer();
dfd2 = $q.defer();
Service1.queryAll().then(function(data) {
// prepare data 1
dfd1.resolve();
});
Service2.queryAll().then(function(data) {
// prepare data 2
dfd2 .resolve();
});
$q.all([dfd1.promise,dfd2.promise]).then(function() {
// use data 1 & 2
})
或者我可以使用 queryAll()
在 $q.all
中调用返回的承诺吗?
我的意思是:将在 $q.all
中的回调在之前成功的回调完成后执行,或者可能存在 $q.all
回调将在 Service1
和 Service2
之前执行的情况成功回调完成执行?
这与$q
无关。这是一个例子:
var p1 = Service1.queryAll();
var p2 = p1.then(function (response) { ... });
//Everything chained to p1 will resolve BEFORE p2 is executed.
//Naturally everything chained to p2 will execute after p1 and p2.
您可以将承诺视为事件处理程序。通过调用 .then
,您可以将另一个事件处理程序附加到该事件。
当 p1 解析时,它会循环注册到它的每个事件处理程序并执行它:
//Inside promise implementation
var eventHandlers = [];
this.then = function(fn){
eventHandlers.push(fn);
if(!this.executed)
this.execute();
}
function whenResolved(data){
eventHandlers.forEach(function(fn){
fn(data);
});
}
注意:这不是实际的工作方式,因为即使承诺已解决,您仍然会执行新注册的事件处理程序,但您可能会更好地理解它的工作方式。
当有一段代码依赖于其他承诺准备的数据时,我是否必须创建额外的辅助承诺:
var dfd1,dfd2;
dfd1 = $q.defer();
dfd2 = $q.defer();
Service1.queryAll().then(function(data) {
// prepare data 1
dfd1.resolve();
});
Service2.queryAll().then(function(data) {
// prepare data 2
dfd2 .resolve();
});
$q.all([dfd1.promise,dfd2.promise]).then(function() {
// use data 1 & 2
})
或者我可以使用 queryAll()
在 $q.all
中调用返回的承诺吗?
我的意思是:将在 $q.all
中的回调在之前成功的回调完成后执行,或者可能存在 $q.all
回调将在 Service1
和 Service2
之前执行的情况成功回调完成执行?
这与$q
无关。这是一个例子:
var p1 = Service1.queryAll();
var p2 = p1.then(function (response) { ... });
//Everything chained to p1 will resolve BEFORE p2 is executed.
//Naturally everything chained to p2 will execute after p1 and p2.
您可以将承诺视为事件处理程序。通过调用 .then
,您可以将另一个事件处理程序附加到该事件。
当 p1 解析时,它会循环注册到它的每个事件处理程序并执行它:
//Inside promise implementation
var eventHandlers = [];
this.then = function(fn){
eventHandlers.push(fn);
if(!this.executed)
this.execute();
}
function whenResolved(data){
eventHandlers.forEach(function(fn){
fn(data);
});
}
注意:这不是实际的工作方式,因为即使承诺已解决,您仍然会执行新注册的事件处理程序,但您可能会更好地理解它的工作方式。