Как реализовать setTimeout перед блокировкой в ​​nodeJS

У меня есть такой код блокировки:

let a = 0;
setTimeout(() => {
    console.info(a);
    process.exit();
}, 1000);


while (true) {
    a++;
}

Как я могу использовать функцию nexttick для разблокировки тайм-аута? Или что-то вроде этого, чтобы реализовать setTimeout перед блокировкой while?

Я бы посоветовал вообще не делать блокирующую петлю while. Подумайте об использовании обратных вызовов или обещаний между итерациями цикла или рассмотрите, почему вам в первую очередь нужно использовать этот цикл.

serakfalcon 03.07.2018 09:55

Вы можете привести мне пример, пожалуйста

drothouu 03.07.2018 09:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обратный вызов, который вы регистрируете в setTimeout, никогда не будет вызван, поскольку вы блокируете основной поток.

Вы можете установитьInterval для достижения чего-то подобного, например.

let a = 2;
setTimeout(() => {
    console.info(a);
    process.exit();
}, 1000);

setInterval(() => {
    // Square a
    a = a * a;
}, 200);

Блокировка основного потока в Node - не лучшая идея! Обычно есть лучший способ делать что-то асинхронным способом.

Спасибо за ответ, важен порядок исполнения. А когда я хочу запустить a = a * a;

drothouu 03.07.2018 10:06

Вы можете контролировать порядок выполнения, задав длину интервала для setInterval и setTimeout, например запустите setInterval 100 раз, прежде чем обратный вызов setTimeout сработает один раз!

Terry Lennox 03.07.2018 10:13

Узел блокируется, когда вы запускаете синхронный код, а это означает, что если у вас есть длительный цикл, может быть полезно структурировать его асинхронным способом, чтобы он стал неблокирующим.

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);

Другие вопросы по теме