为什么Promise中的回调延迟不会被运行?

时间:2016-04-06 16:34:54

标签: javascript asynchronous promise ecmascript-6

以下是演示:

var forever = new Promise(function (resolve, reject) {
  while (true) {
  }
  resolve("done")

});
console.log("Promise returned")

永远不会执行console.log("Promise returned")。似乎forever的评估将阻止线程并且永远不会返回。

将函数体包裹到setTimeout解决了这个问题:

var forever = new Promise(function (resolve, reject) {
  setTimeout(function() {
    while (true) {
    }
    resolve("done")
  },0)

});
console.log("Promise returned")

Promise的回调参数不应该延迟才能执行(不需要被setTimeout包装)?有没有关于这种行为的文件?

2 个答案:

答案 0 :(得分:3)

规范的

Section 25.4.3.1指出“当使用参数执行程序调用Promise函数时”采取以下步骤:

  
      
  1. 让完成为Call(executor, undefined, «resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]]»)
  2.   

因此,规范要求在构造期间调用Promise构造函数的回调。 MDN notes thi也是如此:

  

执行函数立即执行。

executor函数不一定需要立即调用resolvereject,而是在new Promise返回之前调用它。

答案 1 :(得分:0)

传递给date = MyModel.objects.order_by('date').first() name = MyModel.objects.order_by('name').first() 的函数被同步调用。它可以调用其他异步函数,并在这些函数的回调中解析(或拒绝)promise,但如果你直接在该顶级函数中执行new Promise(),它立即阻止浏览器。