Po prvé, vyhlasujem, let b = true
mimo callback funkcie. Je to re-inicializovaný na každý hovor inak.
Po druhé, 10000 v clearTimeout(fnInterval, 10000)
nie je platný parameter. clearTimeout(timeoutId)
akceptuje len prvý parameter a vymaže timeout prešiel okamžite. By ste potrebovať setTimeout
na spustenie tohto po 10 sekundách, ak je to váš cieľ. Ale, že spôsobuje rasy stave medzi dve časové limity, -- imprecision môže znamenať, že budete chýbať niektoré denníky alebo natahovat s možnosťou denníky.
Pomocou počítadla je jedným z riešení, ako ostatné odpovede show, ale zvyčajne, keď som pomocou zložitých načasovanie s setInterval
že vyžaduje ich vymazanie po určitý počet iterácie, som refactor na všeobecné promisified sleep
funkcie založené na setTimeout
. To vedie predvoľba oveľa čistejšie (č volania) a vyhýba sa umazávání s clearTimeout
.
Namiesto boolean flip vlajku a späť medzi dvoma správy, lepším riešením je použiť pole a modul aktuálny index podľa správy pole dĺžky. Je to oveľa jednoduchšie, ak chcete pridať ďalšie položky na prechádzanie a kód je ľahšie pochopiť, keďže štát je implicitný v protismere.
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);
}
})();