Prima di tutto, dichiarare let b = true
al di fuori della funzione di callback. È re-inizializzato a ogni chiamata diversamente.
In secondo luogo, i 10000 in clearTimeout(fnInterval, 10000)
non è un parametro valido. clearTimeout(timeoutId)
accetta solo il primo parametro e cancella il timeout restituito immediatamente. C'è bisogno di una setTimeout
per attivare questo dopo 10 secondi, se questo è il vostro obiettivo. Ma che provoca una condizione di competizione tra i due timeout -- imprecisione può dire che verrà a mancare alcuni dei registri o di vento fino con registri aggiuntivi.
Utilizzando un contatore è una soluzione, come altre risposte di spettacolo, ma di solito quando sto usando il complesso di temporizzazione con setInterval
che richiede di cancellarlo dopo un certo numero di iterazioni, ho il refactoring di un generico promisified sleep
la funzione di base setTimeout
. Questo mantiene il codice chiamante molto più pulito (nessun callback) e si evita di fare confusione con clearTimeout
.
Invece di un boolean per capovolgere una bandiera e indietro tra due messaggi, una soluzione migliore è quella di utilizzare un array e modulo corrente dell'indice di messaggi di lunghezza dell'array. Questo rende molto più facile per aggiungere altri elementi al ciclo e il codice è più facile da capire in quanto lo stato è implicita nel contatore.
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);
}
})();