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。
无论如何,这实际上没有意义,因为通常您不知道 promiseA
在 promiseB
之前完成。当 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);
});
假设已按以下顺序执行了以下语句:
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。
无论如何,这实际上没有意义,因为通常您不知道 promiseA
在 promiseB
之前完成。当 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);
});