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

In what order are Promise callbacks triggered?

假设已按以下顺序执行了以下语句:

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

现在 promiseA 已满 接下来是 promiseB.

规范中有定义吗(this最新的规范?)三个回调的触发顺序是什么?

A1 是否总是在 A2 之前触发? (更新:是的,根据 this spec, as pointed to from this answer 的 2.2.6.1。)

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

Will A1/A2 always be triggered before B (since A was fulfilled before B)?

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

无论如何,这实际上没有意义,因为通常您不知道 promiseApromiseB 之前完成。当 promiseB 派生自 promiseA 时,您只能依赖它 - 然后 B 的回调保证在导致 B 的 A 上的 "derivation callback" 之后被调用。

因此,如果您需要保证仅在 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);
});