Promise回调的触发顺序是什么?

时间:2015-01-13 13:25:10

标签: javascript promise

按顺序执行以下语句:

promiseA.then(function() { console.log('A1'); });
promiseB.then(function() { console.log('B'); });
promiseA.then(function() { console.log('A2'); });

现在promiseA已完成,然后是 promiseB

是否在规范中定义了(this最新的规范?)三种回调的触发顺序是什么?

A1之前是否始终触发A2? (更新:是的,根据this specthis answer开始的每2.2.6.1。)

A1 / A2是否会在B之前被触发(因为A在B之前完成)?

1 个答案:

答案 0 :(得分:1)

  

在B之前是否总是触发A1 / A2(因为A在B之前完成)?

不,不一定。回调的顺序仅根据承诺定义。甚至可能发生B在A1和A2之间被触发。

这无论如何都没有意义,因为通常你不会知道promiseA之前完成promiseB。当promiseBpromiseA派生时,你只能依赖它 - 然后保证在"派生回调"之后调用B的回调。在导致B的A。

所以,如果你需要保证只在A1和A2之后发出回调(因为它依赖于他们的结果),你应该这样做

var promiseA1 = promiseA.then(function(a) { console.log('A1'); return 'A1'; });
var promiseA2 = promiseA.then(function(a) { console.log('A2'); return 'A2'; });
Promise.all([promiseB, promiseA1, promiseA2]).spread(function(b, a1, a2) {
    console.log('B after ', a1, a2);
});