Как вызывать две асинхронные функции каждые `n` и `m` секунд в цикле `while (true)`?

#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 функции выполнялись одновременно, чтобы инициализация одной не блокировала запуск другой.