说以下语句已按此顺序执行:
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的指示,按照this answer的2.2.6.1进行。)会在
A1
之前始终触发A2
/ B
吗(因为A在B之前完成)? 最佳答案
不,不一定。回调的顺序仅按 promise 定义。甚至可能会在A1和A2之间触发B。
无论如何,这实际上没有任何意义,因为通常您不知道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);
});