У меня есть такой код блокировки:
let a = 0;
setTimeout(() => {
console.info(a);
process.exit();
}, 1000);
while (true) {
a++;
}
Как я могу использовать функцию nexttick для разблокировки тайм-аута? Или что-то вроде этого, чтобы реализовать setTimeout перед блокировкой while?
Вы можете привести мне пример, пожалуйста





Обратный вызов, который вы регистрируете в setTimeout, никогда не будет вызван, поскольку вы блокируете основной поток.
Вы можете установитьInterval для достижения чего-то подобного, например.
let a = 2;
setTimeout(() => {
console.info(a);
process.exit();
}, 1000);
setInterval(() => {
// Square a
a = a * a;
}, 200);
Блокировка основного потока в Node - не лучшая идея! Обычно есть лучший способ делать что-то асинхронным способом.
Спасибо за ответ, важен порядок исполнения. А когда я хочу запустить a = a * a;
Вы можете контролировать порядок выполнения, задав длину интервала для setInterval и setTimeout, например запустите setInterval 100 раз, прежде чем обратный вызов setTimeout сработает один раз!
Узел блокируется, когда вы запускаете синхронный код, а это означает, что если у вас есть длительный цикл, может быть полезно структурировать его асинхронным способом, чтобы он стал неблокирующим.
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);
Я бы посоветовал вообще не делать блокирующую петлю
while. Подумайте об использовании обратных вызовов или обещаний между итерациями цикла или рассмотрите, почему вам в первую очередь нужно использовать этот цикл.