#javascript #async-await #es6-promise
#javascript #async-ожидание #es6-обещание
Вопрос:
У меня есть следующий цикл:
while (true) {
await f();
await g();
}
где f
и g
определяются следующим образом:
async function f() {
await Promise.all([SOME_REQUEST_F, sleep(1000)])
}
async function g() {
await Promise.all([SOME_REQUEST_G, sleep(5000)])
}
Также sleep
определяется следующим образом:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
Мое намерение состоит в том, чтобы SOME_REQUEST_F
ожидать каждую секунду и SOME_REQUEST_G
ожидать каждые пять секунд, следовательно, оборачивая их в f
и g
.
Однако в настоящее время g
блокируется повторное ожидание f
внутри цикла.
Как определить sleep
, чтобы при использовании в g
она блокировала повторное выполнение g
, но не выполнение f
? Есть ли лучший способ сделать то, что я хочу?
Ответ №1:
Вместо этого используйте два while
цикла:
(async () => {
setTimeout(async () => {
while (true) {
await f();
}
});
while (true) {
await g();
}
})();
setTimeout
Это необходимо для того, чтобы обе while
функции выполнялись одновременно, чтобы инициализация одной не блокировала запуск другой.