Tout d'abord, déclarer let b = true
en dehors de la fonction de rappel. C'est réinitialisée à chaque appel autrement.
Deuxièmement, les 10000 clearTimeout(fnInterval, 10000)
n'est pas un paramètre valide. clearTimeout(timeoutId)
accepte seulement le premier paramètre et efface le délai d'expiration immédiatement. Vous auriez besoin d'un setTimeout
pour déclencher ce bout de 10 secondes, si c'est votre but. Mais qui provoque une condition de concurrence entre les deux délais d'attente -- imprécision peut signifier que vous allez manquer certains de journaux ou de vent avec d'autres journaux.
À l'aide d'un compteur est une solution, comme d'autres réponses montrer, mais en général, quand je suis en utilisant le complexe de la synchronisation avec des setInterval
qui nécessite de l'effacer après un certain nombre d'itérations, je refactoriser un générique promisified sleep
fonction sur la base d' setTimeout
. Cela permet de maintenir l'appel de code beaucoup plus propre (pas de rappels) et évite de jouer avec clearTimeout
.
Au lieu d'un booléen pour retourner un drapeau en arrière-et-vient entre les deux messages, une meilleure solution est d'utiliser un tableau et le module de l'index actuel par les messages longueur du tableau. Cela le rend beaucoup plus facile d'ajouter plus d'éléments à parcourir et le code est plus facile à comprendre, puisque l'état est implicite dans le compteur.
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);
}
})();