Primeiro de tudo, declarar let b = true
fora da função de retorno de chamada. É re-inicializado em cada chamada de outra forma.
Em segundo lugar, a 10000 em clearTimeout(fnInterval, 10000)
não é um parâmetro válido. clearTimeout(timeoutId)
aceita apenas o primeiro parâmetro e limpa o tempo de espera passou-se imediatamente. Você precisa de um setTimeout
para acionar esta, após 10 segundos, se esse é o seu objetivo. Mas o que faz com que uma condição de corrida entre os dois tempos de espera -- imprecisão pode significar que você vai perder alguns dos logs ou acabar com o extra de logs.
Utilizando um contador é uma solução, como outras respostas mostram, mas normalmente quando eu estou usando complexos de tempo com setInterval
que requer limpá-lo depois de um certo número de iterações, eu refatorar para um genérico promisified sleep
função com base na setTimeout
. Isso mantém o chamado código muito mais limpo (sem retornos de chamada) e evita mexer com clearTimeout
.
Em vez de um valor booleano para virar um sinalizador para trás e para a frente entre duas mensagens, uma solução melhor é usar uma matriz e módulo de elasticidade o atual índice pelas mensagens comprimento da matriz. Isso torna muito mais fácil para adicionar mais itens para percorrer e o código é mais fácil de entender, pois o estado está implícita no contador.
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);
}
})();