ข้ามไปยังเนื้อหา

Timers

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(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(fn, 0) ไม่ได้ หมายถึง “รันทันที” แต่จัดคิว fn เป็น macrotask microtask ที่ค้างอยู่ (callback ของ Promise, queueMicrotask) จะทำงานก่อน

setTimeout(function() { console.log('Timer'); }, 0);
Promise.resolve().then(function() { console.log('Promise'); });
// Output: Promise, then Timer

หากต้องการจัดคิว 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 ระบายก่อน

JavaScript

ผลลัพธ์จะเป็นเสมอ: Promise ran first, แล้ว Timer ran second

setTimeout(fn, 0) รับประกันหรือไม่ว่าจะรัน fn ทันทีหลังโค้ด synchronous ปัจจุบัน?
คุณหยุด setInterval ไม่ให้ทำงานอีกได้อย่างไร?
ฟังก์ชันใดจัดคิว callback ใน microtask queue (ไม่ใช่ timer queue)?