我正在使用promises进行一些测试,并且我编写的代码行为与我期望的方式不同:
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中的循环阻止了代码的执行?
为什么promise中的循环阻止了代码的执行?
这是JavaScript执行模型(在浏览器和节点中)。您的代码永远不会被占用,代码始终从头到尾运行,并且只能“注册”平台的代码以便稍后运行。
promise构造函数同步运行。 Promise不会在代码中引入线程,它们只会将then
回调中的代码推迟到“在所有同步代码之后”但在所有平台代码之前。
Promise只是未来值的一个句柄 - 它们不会使您的代码在另一个线程上执行。如果你需要在另一个线程上运行代码,你需要使用worker_threads
(在Node.js中)或浏览器中的web worker。
问题是你的promise不包含任何异步代码。如果你不想等待执行function1的promise中的代码,你需要写它,例如在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();