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

时间:2017-02-21 06:47:48

标签: javascript ecmascript-6 promise specifications

我想确认当同一个承诺上有多个回调时,传递给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。我想知道是否也确定了回调执行的顺序。

2 个答案:

答案 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]]是一个函数,则调用它传递给定的参数。

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

         

    一个。执行EnqueueJob(“PromiseJobs”,PromiseReactionJob,«反应,论证»)。

  2.   

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

答案 1 :(得分:2)

来自specs

  

如果承诺的[[PromiseState]]内部广告位的值是&#34;等待&#34;,

     
      
  • 将fulfillReaction附加为List的 last 元素,该元素是promise [[PromiseFulfillReactions]]内部插槽的值。
  •   

所以是的,通过多次调用then(),您可以确信回调顺序与您调用的顺序相同。