解决承诺时的成功回调顺序

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 回调将在 Service1Service2 之前执行的情况成功回调完成执行?

这与$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);
 });
}

注意:这不是实际的工作方式,因为即使承诺已解决,您仍然会执行新注册的事件处理程序,但您可能会更好地理解它的工作方式。