我正在做一些带有Promise的测试,并且编写的代码表现得不符合我的期望:
function function1() {
return new Promise((resolve, reject) => {
let i = 5000000000;
while (i > 0) {
i--;
}
resolve("print function1!!!");
});
}
function function2() {
console.log("print function2!!!");
}
function function3() {
function1().then(data => console.log(data));
function2();
}
function3();
此代码的执行等待function1中循环的完成,然后打印:
打印功能2 !!!
打印功能1 !!!
我期望代码会打印“ print function2 !!!”。然后等待循环完成,然后打印“ print function1 !!!”。
promise中的循环为什么会阻塞代码的执行?
答案 0 :(得分:4)
promise中的循环为什么会阻塞代码的执行?
这是JavaScript执行模型(在浏览器和Node中)。您的代码永远不会被抢占,代码总是从头到尾运行,并且只能为平台“注册”代码以便以后运行。
promise构造函数同步运行。承诺不会在您的代码中引入线程,它们只会将then
回调中的运行代码推迟到“在所有同步代码之后”,但在所有平台代码之前。
承诺只是将来值的句柄-它们不会使您的代码在另一个线程上执行。如果需要在另一个线程上运行代码,则需要在浏览器中使用worker_threads
(在Node.js中)或Web worker。
答案 1 :(得分:1)
问题是您的诺言不包含任何异步代码。 如果您不想等待功能1的承诺中的代码被执行,则需要编写例如在setTimeout中。
function function1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
let i = 5000000000;
while (i > 0) {
i--;
}
resolve("print function1!!!");
}, 0);
});
}
function function2() {
console.log("print function2!!!");
}
function function3() {
function1().then(data => console.log(data));
function2();
}
function3();