在承诺中,回调订单是否得到保证?

Pal*_*leo 2 javascript specifications promise ecmascript-6

我想确认当then同一个promise上有多个回调时,是否保证传递给的回调的调用顺序.

这是我观察到的.例:

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
Run Code Online (Sandbox Code Playgroud)

我观察到回调顺序是受到尊重的,但我没有找到关于这个主题的任何文档.回调订单是否有保证?

编辑:这不是一个如何链接承诺的问题.在这里,我只有一个承诺有几个回调.回调then以确定的顺序传递.我想知道是否也确定了回调执行的顺序.

tco*_*ooc 5

如果多次在同一个promise上调用"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]]是一个函数,则调用它传递给定的参数.

  1. 以原始插入顺序重复反应中的每个反应

    一个.执行EnqueueJob("PromiseJobs",PromiseReactionJob,«反应,参数»).

这意味着您的解析器函数将按照添加的顺序调用(在您的情况下,从0到19).