Mid #event-loop#nextTick#microtask#setImmediate
process.nextTick, Promise và setImmediate khác nhau thế nào?
⚡ Trả lời nhanh
Sau thao tác hiện tại, Node chạy hàng đợi process.nextTick trước, rồi microtask của Promise, sau đó mới tới các pha event loop; setImmediate chạy ở pha check, setTimeout ở pha timers. nextTick đệ quy có thể làm đói I/O.
setTimeout(() => console.log("timeout"), 0);
setImmediate(() => console.log("immediate"));
Promise.resolve().then(() => console.log("promise"));
process.nextTick(() => console.log("nextTick"));
console.log("sync");
// sync, nextTick, promise, rồi timeout/immediate (thứ tự 2 cái này không cố định)
| API | Hàng đợi | Chạy khi |
|---|---|---|
process.nextTick | nextTick queue | Ngay sau thao tác hiện tại, trước mọi microtask |
Promise.then, queueMicrotask | microtask queue | Sau nextTick queue, trước khi sang pha tiếp theo |
setTimeout | timers | Pha timers khi hết hạn |
setImmediate | check | Pha check, ngay sau poll |
Với CommonJS, nextTick được xả trước promise. Với ES module (code top-level chạy trong một promise job), promise có thể chạy trước nextTick.