假设已按以下顺序执行了以下语句:
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 的 2.2.6.1,正如来自 this answer 所指出的那样。)
A1
/A2
是否总是在 B
之前触发(因为 A 在 B 之前完成)?
最佳答案
Will A1/A2 always be triggered before B (since A was fulfilled before B)?
不,不一定。回调的顺序仅根据 promise 定义。甚至可能发生 B 在 A1 和 A2 之间触发。
这实际上没有任何意义,因为通常您不知道 promiseA
在 promiseB
之前完成。当 promiseB
派生自 promiseA
时,您只能依赖它 - 然后 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);
});
关于javascript - Promise 回调的触发顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923253/