Timers
setTimeout
หัวข้อที่มีชื่อว่า “setTimeout”setTimeout(fn, delay) จัดคิวให้ fn ทำงานเป็น macrotask หลังจากผ่านไปอย่างน้อย delay มิลลิวินาที ค่า delay เป็น ค่าต่ำสุด — ไม่ใช่การรับประกัน ถ้า call stack ไม่ว่างตอน timer ทำงาน callback จะรอจนกว่า stack จะว่าง
var id = setTimeout(function() { console.log('Runs after at least 100 ms');}, 100);
// ยกเลิกก่อนที่จะทำงาน:clearTimeout(id);setInterval
หัวข้อที่มีชื่อว่า “setInterval”setInterval(fn, delay) จัดคิวให้ fn ซ้ำ ๆ ทุก delay ms ใช้ clearInterval เพื่อหยุด
var count = 0;var id = setInterval(function() { count++; console.log('tick', count); if (count >= 3) clearInterval(id);}, 500);setTimeout ที่มี delay เป็น 0
หัวข้อที่มีชื่อว่า “setTimeout ที่มี delay เป็น 0”setTimeout(fn, 0) ไม่ได้ หมายถึง “รันทันที” แต่จัดคิว fn เป็น macrotask microtask ที่ค้างอยู่ (callback ของ Promise, queueMicrotask) จะทำงานก่อน
setTimeout(function() { console.log('Timer'); }, 0);Promise.resolve().then(function() { console.log('Promise'); });// Output: Promise, then TimerqueueMicrotask
หัวข้อที่มีชื่อว่า “queueMicrotask”หากต้องการจัดคิว callback ให้ทำงานก่อน macrotask ถัดไป ใช้ queueMicrotask:
queueMicrotask(function() { console.log('This runs in the microtask queue, before any timer');});เดโมที่รันได้
หัวข้อที่มีชื่อว่า “เดโมที่รันได้”เดโมนี้แสดงว่า setTimeout(fn, 0) ยังทำงาน หลัง .then ของ Promise ที่ resolve แล้ว เพราะ callback ของ timer เป็น macrotask และ microtask ระบายก่อน
ผลลัพธ์จะเป็นเสมอ: Promise ran first, แล้ว Timer ran second