Her şeyden önce, beyan et let b = true
geri arama işlevinin dışında. Aksi halde her aramada yeniden başlatılır.
İkincisi, 10000 içinde clearTimeout(fnInterval, 10000)
geçerli bir parametre değil. clearTimeout(timeoutId)
yalnızca ilk parametreyi kabul eder ve hemen geçirilen zaman aşımını temizler. İhtiyacın olacak setTimeout
hedefiniz buysa, bunu 10 saniye sonra tetiklemek için. Ancak bu, iki zaman aşımı arasında bir yarış koşuluna neden olur-yanlışlık, bazı günlükleri kaçıracağınız veya fazladan günlüklerle sonuçlanacağınız anlamına gelebilir.
Bir sayaç kullanmak, diğer cevapların gösterdiği gibi bir çözümdür, ancak genellikle karmaşık zamanlama kullandığımda setInterval
bu, birkaç yinelemeden sonra temizlemeyi gerektirir, genel bir söze refactor sleep
dayalı fonksiyon setTimeout
. Bu, arama kodunu çok daha temiz tutar (geri arama yok) ve bunlarla uğraşmayı önler clearTimeout
.
Bayrağı iki ileti arasında ileri geri çevirmek için bir boole yerine, daha iyi bir çözüm bir dizi kullanmak ve geçerli dizini iletiler dizisi uzunluğuna göre modüllemektir. Bu, geçiş yapmak için daha fazla öğe eklemeyi çok daha kolaylaştırır ve durum sayaçta örtülü olduğundan kodun anlaşılması daha kolaydır.
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);
}
})();