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.
