Za prvé, prohlásit let b = true
mimo funkci zpětného volání. To je re-inicializaci na každé volání jinak.
Za druhé, 10000, v clearTimeout(fnInterval, 10000)
není platný parametr. clearTimeout(timeoutId)
přijímá pouze první parametr a vymaže časový limit prošel okamžitě. Potřebujete setTimeout
aktivuje po 10 sekundách, pokud je to váš cíl. Ale to způsobí, že spor mezi dvěma timeouty -- nepřesnost může znamenat, že budete chybět některé deníky nebo skončit s další protokoly.
Pomocí čítače je jedním z řešení, jako další odpovědi ukazují, ale obvykle, když jsem pomocí komplexní načasování s setInterval
to vyžaduje vymazání po určitém počtu iterací, jsem refaktorovat, aby obecný promisified sleep
funkce založené na setTimeout
. To udržuje volající kód mnohem čistší (žádné volání) a vyhýbá se probírat s clearTimeout
.
Místo boolean flip vlajku tam a zpět mezi dvěma zprávami, lepším řešením je použít pole a modulo aktuální index do zprávy délka pole. To dělá to mnohem jednodušší přidat více položek, které chcete procházet a kód je srozumitelnější, protože stát je implicitní v pultu.
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);
}
})();