Wyszukiwanie w witrynie

javascript - Jak wywołać dwie funkcje asynchroniczne co `n` i `m` sekund w pętli `while (true)`?


Mam następującą pętlę:

while (true) {
  await f();
  await g();
}

gdzie f i g są zdefiniowane w następujący sposób:

async function f() {
    await Promise.all([SOME_REQUEST_F, sleep(1000)])
}

async function g() {
    await Promise.all([SOME_REQUEST_G, sleep(5000)])
}

Również sleep jest zdefiniowana w następujący sposób:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Moim zamiarem jest, aby SOME_REQUEST_F był oczekiwany co sekundę, a SOME_REQUEST_G co pięć sekund, stąd opakowanie ich w f i g.

Jednak obecnie g blokuje ponowne oczekiwanie na f w pętli.

Jak zdefiniować sleep, tak aby w przypadku użycia w g blokowało ponowne wykonanie g, ale nie f? Czy istnieje lepszy sposób na osiągnięcie tego, co chcę?

Odpowiedź #1

Użyj zamiast tego dwóch pętli while:

(async () => {
  setTimeout(async () => {
    while (true) {
      await f();
    }
  });
  while (true) {
    await g();
  }
})();

Funkcja setTimeout jest tutaj potrzebna, aby oba while mogły działać jednocześnie, tak aby inicjalizacja jednego nie blokowała rozpoczęcia drugiego.