我有这样的阻塞代码:
let a = 0;
setTimeout(() => {
console.log(a);
process.exit();
}, 1000);
while (true) {
a++;
}
如何使用nexttick
函数解锁超时?或者有人这样想在阻止之前实现 setTimeout?
您在 setTimeout 中注册的回调永远不会被调用,因为您正在阻塞主线程。
您可以设置间隔来实现类似的东西,例如
let a = 2;
setTimeout(() => {
console.log(a);
process.exit();
}, 1000);
setInterval(() => {
// Square a
a = a * a;
}, 200);
在 Node 中阻止主线程并不是一个好主意!通常有更好的方法来异步方式做事。
当您运行同步代码时,Node 会被锁定,这意味着如果您有一个长时间运行的循环,则以异步方式构建它可能会有所帮助,以便它变得非阻塞。
while(true) {
doSomeSyncronousStuff();
}
应该变成类似的东西
let someDelay = 0;
let loop = function(continueRunning){
doSomeSyncronousStuff();
if(continueRunning) {
// delay of as little as 0 pushes execution to at least next tick
setTimeout(loop,someDelay,continueRunning);
}
};
loop(true);