Przede wszystkim, należy zadeklarować let b = true
poza funkcji wywołania zwrotnego. W przeciwnym razie ponownie zainicjowany przy każdym wywołaniu.
Po drugie, w 10000 clearTimeout(fnInterval, 10000)
nie jest prawidłowym ustawieniem. clearTimeout(timeoutId)
akceptuje tylko pierwszy parametr i natychmiast usuwa czas oczekiwania przekazana. Trzeba setTimeout
aby uruchomić to przez 10 sekund, jeśli to jest twoim celem. Ale to powoduje, że stan wyścig między dwoma przekroczenia limitu czasu-niedokładność może oznaczać, że zauważysz jakieś logi lub uzyskaj więcej dzienniki.
Korzystanie z licznika-to jedno z rozwiązań, jak pokazują inne odpowiedzi, ale zazwyczaj, gdy używam trudny czas z setInterval
do tego należy oczyścić go po pewnej ilości iteracji, ja рефакторирую do wspólnego obiecanego sleep
funkcja oparta na setTimeout
. To sprawia, że kod wywołujący znacznie czystsze (bez wywołań zwrotnych) i pozwala uniknąć kłopotów z clearTimeout
.
Zamiast logicznego znaczenia dla zmiany flagi tam i z powrotem między dwoma wiadomości najlepszym rozwiązaniem jest użycie tablicy i moduł bieżącego indeksu na długości tablicy wiadomości. To znacznie ułatwia dodawanie większej ilości elementów, aby przełączać się między, a kod łatwiej zrozumieć, ponieważ stan niejawnie podano w liczniku.
const sleep = ms => new Promise(res => setInterval(res, ms));
(async () => {
const messages = ["hi", "bye"];
for (let i = 0; i < 10; i++) {
console.log(messages[i%messages.length]);
await sleep(1000);
}
})();