Код сна Javascript запущен, но, похоже, не вызывает никаких задержек

#node.js #angular

Вопрос:

Это угловатое приложение, и этот конкретный код находится внутри веб — редактора в машинописном виде. Я все еще новичок в веб-работниках, но и режим сна, и цикл выполняются в одном потоке.

Цель состоит в том, чтобы опросить службу и выйти из цикла, когда процесс завершен. Моя проблема в том, что приведенный ниже вызов сна не засыпает. Мне нужно, чтобы он задержался по крайней мере на 9 секунд, и в идеале я хотел бы, чтобы он был настраиваемым. Но это происходит так, как будто сон не бежал.

У меня есть два вопроса:

  1. Почему сон не работает?
  2. Это угловое приложение, обслуживаемое контейнером NodeJS на cirrus. Когда приложение Angular запрашивается и обслуживается этим сервером NodeJS, я хотел бы передать секрет, определенный на сервере NodeJS, вместе с приложением Angular. Этот секрет будет заключаться в задержке опроса. Будет ли возвращено значение файла cookie в ответе приложения NodeJS Angular? Не уверен, что это был бы лучший ответ.

Код ниже:

 
function sleep(ms: number) {
    return new Promise((resolve) => {
        log('DEBUG','Sleeping for '   ms   ' ms');
        setTimeout(resolve, ms);
    });
}

while (jobIsStillRunning(jobExecutionResult)) {
    postMessageWithLog(jobExecutionResult);
    log('DEBUG','sendFilePolling() jobExecutionResult='   JSON.stringify(jobExecutionResult));
    sleep(30000);  // Sleep function runs but doesn't do anything.
    jobExecutionResult = await getAsyncFilesResult(jobExecutionResult);
}
 

Ответ №1:

Вам нужно дождаться включения sleep функции

Комментарии:

1. Должен ли я «ждать» при вызове метода sleep() или добавить ключевое слово await в прототип sleep?

2. вам нужен метод ожидания только для сна, так как сон возвращает обещание, вы должны ждать его.

Ответ №2:

Я думаю, что вам нужно знать macro и micro задачи.

Microtasks исходите исключительно из нашего кодекса. Они обычно создаются обещаниями: выполнение .then/catch/finally обработчика становится микрозадачей

Если микрозадача рекурсивно ставит в очередь другие микрозадачи, может потребоваться много времени, пока не будет обработана следующая макрозадача. Это означает, что вы можете в конечном итоге получить заблокированный пользовательский интерфейс или какой-либо завершенный ввод-вывод в вашем приложении.

пример:

macrotasks : setTimeout, setInterval, setImmediate, ввод/вывод, визуализация пользовательского интерфейса и т. Д./

microtasks : процесс.Следующий шаг, Обещания и т. Д.

код:

 console.log('1')

setTimeout(()=>{
  console.log('2')
},0)

Promise.resolve().then(()=>{
  console.log('3')
})

console.log('4')
 

выход:

 1
4
3
2
 

чего ждать?!

объяснять:

  • console.log('1') это обычный код и сразу же запускается.
  • setTimeout это макрозадача, затем она будет добавлена в очередь макросов
  • Promise.resolve это микрозадача, затем она будет добавлена в микро-очередь
  • console.log('4') это обычный код и сразу же запускается.

теперь, когда обычные коды закончились microtaskqueue , и теперь macrotaskqueue их нужно удалить из очереди.

  • внутри microtaskqueue у нас есть одна задача, и Promise.resolve затем она немедленно запускается .then .

теперь microtaskqueue тоже ясно, внутри macrotaskqueue у нас есть одна задача, и setTimeout затем она немедленно запускается timeoutCallback .

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