#node.js #angular
Вопрос:
Это угловатое приложение, и этот конкретный код находится внутри веб — редактора в машинописном виде. Я все еще новичок в веб-работниках, но и режим сна, и цикл выполняются в одном потоке.
Цель состоит в том, чтобы опросить службу и выйти из цикла, когда процесс завершен. Моя проблема в том, что приведенный ниже вызов сна не засыпает. Мне нужно, чтобы он задержался по крайней мере на 9 секунд, и в идеале я хотел бы, чтобы он был настраиваемым. Но это происходит так, как будто сон не бежал.
У меня есть два вопроса:
- Почему сон не работает?
- Это угловое приложение, обслуживаемое контейнером 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
функцией и подождать ее