我试图想出一个简单的例子来展示 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”。不应该立即调用吗?
答案 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");