อย่างแรกประกาศ let b = true
ออกไปข้างนอกเรียกกลับฟังก์ชัน. มันเป็นส่สามารถใช้ถอบกันและโทรหาอีกอย่าง
อย่างที่สองที่ใน 10000 clearTimeout(fnInterval, 10000)
ไม่ใช่ที่ถูกต้องพารามิเตอร์. clearTimeout(timeoutId)
ยอมรับเพียงคนแรกพารามิเตอร์และล้างหมดเวลาผ่านไปในทันที คุณต้องการ setTimeout
เพื่อกระตุ้นนี้หลังจาก 10 วินาทีถ้านั่นเป็นของคุณเป้าหมาย. แต่นั่นทำให้การแข่งขันสภาพระหว่างสองคน timeouts--imprecision ได้หมายความว่าคุณจะคิดถึงบางอย่างของปูมบันทึกหรือบลงกับพิเศษปูมบันทึก.
ใช้เคาน์เตอร์คือหนึ่งแก้ปัญหาเช่นกันคำตอบแสดงแต่ปกติแล้วตอนที่ฉันกำลังใช้ซับซ้อนเวลากับ setInterval
นั่นต้องการเคลียร์มันหลังจากที่มีจำนวนของการทำซ้ำฉัน refactor ต้องเป็นทั่วไป promisified sleep
ฟังก์ชันจากพื้นฐาน setTimeout
. วิธีนี้จะทำให้เรียกรหัสมากเครื่องมือทำความสะอาด(ไม่มีคอลแบก)และ avoids วุ่นวายกับ clearTimeout
.
แทนที่จะเป็นค่าตรรกะที่จะพลิกภาพธงกลับมาและไว้ระหว่างสองข้อความที่ดีกว่านี้คือทางออกเพื่อใช้เป็นอาเรย์และ modulus ดัชนีปัจจุบันโดยข้อความตารางคู่ลำดับความยาว. มันทำให้มันง่ายมากเลยที่จะเพิ่มรายการที่จะลงตรวจดูและรหัสมันง่ายกว่าที่จะเข้าใจตั้งแต่ของรัฐคือที่แยกกำหนดอยู่ในรยืมมาที่เคาท์เตอร์
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);
}
})();