我想确认当同一个承诺上有多个回调时,传递给then
的回调的调用顺序是否有保证。
这是我观察到的。例如:
function wait(delayMs) {
return new Promise(resolve => setTimeout(resolve, delayMs))
}
let prom = wait(500)
for (let i = 0; i < 20; ++i)
prom.then(() => { console.log(i) }) // OK: Display 0 to 19 in the right order
我发现回调订单得到了尊重,但我没有找到关于这个主题的任何文档。回调订单是否有保证?
编辑:这不是关于如何链接承诺的问题。在这里,我只有一个承诺有几个回调。回调以确定的顺序传递给then
。我想知道是否也确定了回调执行的顺序。
答案 0 :(得分:5)
如果您多次在同一个承诺上调用“then”(没有链接),则将按照添加的顺序调用解析器函数。
ECMAScript 2015规范规定,如果承诺得到解决,“反应”将按插入顺序排列。
http://www.ecma-international.org/ecma-262/6.0/#sec-triggerpromisereactions
25.4.1.8 TriggerPromiseReactions(反应,参数)
抽象操作TriggerPromiseReactions获取PromiseReactionRecords的集合,并为每条记录排队一个新Job。每个这样的Job处理PromiseReactionRecord的[[Handler]],如果[[Handler]]是一个函数,则调用它传递给定的参数。
- 醇>
以原始插入顺序重复反应中的每个反应
一个。执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,«反应,论证»)。
这意味着您的解析器功能将按照添加顺序调用(在您的情况下,从0到19)。
答案 1 :(得分:2)
来自specs:
如果承诺的[[PromiseState]]内部广告位的值是&#34;等待&#34;,
- 将fulfillReaction附加为List的 last 元素,该元素是promise [[PromiseFulfillReactions]]内部插槽的值。
所以是的,通过多次调用then()
,您可以确信回调顺序与您调用的顺序相同。