以下代码片段,我想了解NodeJS运行时如何处理它:
const billion = 1000000000;
function longRunningTask(){
let i = 0;
while (i <= billion) i++;
console.log(`Billion loops done.`);
}
function longRunningTaskProm(){
return new Promise((resolve, reject) => {
let i = 0;
while (i <= billion) i++;
resolve(`Billion loops done : with promise.`);
});
}
function longRunningTaskPromResolve(){
return Promise.resolve().then(v => {
let i = 0;
while (i <= billion) i++;
return `Billion loops done : with promise.resolve`;
})
}
console.log(`*** STARTING ***`);
console.log(`1> Long Running Task`);
longRunningTask();
console.log(`2> Long Running Task that returns promise`);
longRunningTaskProm().then(console.log);
console.log(`3> Long Running Task that returns promise.resolve`);
longRunningTaskPromResolve().then(console.log);
console.log(`*** COMPLETED ***`);
第一种方法:
longRunningTask()函数将阻塞主线程,这是预期的。
第二种方法:
在longRunningTaskProm()中,将相同的代码封装在Promise中,期望执行将移动到主线程之外,并作为微任务运行。但似乎并非如此,想要了解背后发生了什么。
第三种方法:
第三种方法longRunningTaskPromResolve()有效。
这是我的理解:
创建和执行Promise仍然与主线程挂钩。只有Promise被解析后的执行会作为微任务移动。
我对我找到的所有资源及自己的理解都不太满意。
new Promise
的回调函数就是创建Promise。没有Promise的“执行”,Promise不会“运行”或者是“可执行”的东西。 - Bergi