Thứ tự: sync → nextTick → promise → sau đó timeout và immediate theo thứ tự không cố định.
Vì sao:
1. console.log('sync') chạy đồng bộ trước hết.
2. Sau khi stack đồng bộ rỗng, Node xử lý nextTick queue trước, rồi mới tới microtask queue của Promise. process.nextTick không thuộc event loop — nó chạy xen giữa các thao tác, ưu tiên cao hơn .then.
3. setTimeout chạy ở phase timers, setImmediate chạy ở phase check. Khi cả hai được đăng ký ở main module, thứ tự phụ thuộc thời gian khởi động tiến trình: nếu vòng lặp bắt đầu sau hơn 1ms thì timeout trước, ngược lại immediate trước. Chạy nhiều lần sẽ thấy đổi thứ tự.
Điểm cần nhớ: nextTick > Promise microtask > timers/check, và cặp timeout/immediate ở top-level là không xác định.