Mai întâi de toate, să declare let b = true
în afară de funcția de apel invers. E re-inițializate pe fiecare suna altfel.
În al doilea rând, 10000 în clearTimeout(fnInterval, 10000)
nu este un parametru valabil. clearTimeout(timeoutId)
acceptă doar primul parametru și respinga de expirare a trecut imediat. Ai nevoie de un setTimeout
pentru a declanșa această după 10 secunde, daca asta e scopul tau. Dar care cauzează o condiție cursă între cele două timeout -- imprecizia poate însemna o să pierzi din busteni sau eoliene cu extra busteni.
Cu ajutorul unui contor este o soluție, ca și alte răspunsuri spectacol, dar, de obicei, atunci când eu sunt, folosind complexe de sincronizare cu setInterval
care necesită compensare după un anumit număr de iterații, am refactor la un generic promisified sleep
funcția bazat pe setTimeout
. Acest lucru ține de asteptare cod mult mai curat (nu callback) și evită joc cu clearTimeout
.
În loc de un boolean pentru a răsturna un steag și înapoi între două mesaje, o soluție mai bună este de a folosi o matrice și modul indicele curent de mesaje de lungime matrice. Acest lucru face mult mai ușor pentru a adăuga mai multe elemente pentru a parcurge și codul este mai ușor de înțeles din moment ce statul este implicită în tejghea.
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);
}
})();