Promise 不会立即为函数返回

时间:2021-01-25 16:02:09

标签: javascript promise

我试图想出一个简单的例子来展示 Promise 如何绕过阻塞调用,但是这个例子并没有像我期望的那样工作

function blockForLoopPromise() {
  return new Promise((resolve, reject) => {
    for (let i = 0 ; i < 10000000000 ; i++) {
      
    }
    resolve("done")
  })
}

blockForLoopPromise().then(() => console.log("DONE!"))
console.log("END")

在此示例中,直到 long for 循环完成后才会调用“END”。不应该立即调用吗?

2 个答案:

答案 0 :(得分:2)

<块引用>

不应该立即调用吗?

没有。传递给 Promise 构造函数的函数是同步调用的。

来自MDN

<块引用>

在构造新的 Promise 对象的过程中要由构造函数执行的函数。

您还可以在 specification 中看到该函数被构造函数立即调用(第 9 步)。

答案 1 :(得分:0)

您可以更新以下内容以获得您正在寻找的行为。 setImmediate 在 node 中用于在事件循环的下一次迭代中执行函数

function blockForLoopPromise() {
  return new Promise((resolve, reject) => {
    setImmediate(() => {
      for (let i = 0 ; i < 10000000000 ; i++) {
      
      }
      resolve("done")
    });
  });
}

blockForLoopPromise().then(() => console.log("DONE!")); 
console.log("END");