Câu 1)
Các bác giúp em phân biệt microtask và macrotask trong hàng đợi queue của eventloop với. … Thứ tự chạy … như thế nào?
Có 2 loại task queue đó là macroTask Queue và microTask Queue, macroTask còn có tên gọi khác là Task Queue và microTask cũng có tên gọi là Job Queue. Hai task này nhìn chung là như nhau , những task trong Job Queue ưu tiên hơn những task có trong Task Queue. Thứ tự chạy của các task trong hai queue này như sau:
Ở mỗi chu kỳ của event-loop, nó sẽ check xem call stack có rỗng không, nếu rỗng:
- Lấy một task cũ nhất trong Task Queue ra chạy.
- Sau khi task trong Task Queue chạy xong, event loop sẽ nhìn vào Job Queue (chứa microTask) và chạy hết tất cả các tasks trong này.
- Kết thúc chu kỳ event-loop quay lại bước 1 cho đến khi chay hết task queue.
Câu 2)
Khi gọi một hàm async thì làm sao biết nó sẽ vào queue nào?
-
Để đưa một task vào Task Queue ta có một số API vd như setTimeout, setInterval, setImmediate, requestAnimationFrame, I/O callback, UI render v.v
-
Còn nếu muốn đưa task vào Job Queue ta có process.nextTick, Promises, Object.observe, MutationObserver, ququeMicrotask
Tại sao promise là microtask, còn setTimeout là macrotask mà không phải ngược lại?
Việc này là tùy vào implementation sẽ đưa task vào Job Queue hay TaskQueue, theo mình thấy những browser như Edge, Firefox, Safari sẽ khác với Chrome. Chrome đưa task promise vào microTask, và setTimeout vào macroTask. Đọc thêm bài này khá hay https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/
Câu 3)
setTimeout là một web API hoạt động trên browser, vậy nếu chạy trên môi trường NodeJS thì có gì khác không
Kết quả mong đợi khi ta chạy API này đó là phần code trong callback sẽ được đưa vào Task Queue để chạy sau khi timeout. Tuy nhiên thì có thể nodejs nó sẽ có implementation khác so với browser. Sự khác biệt không đáng kể lắm.