Tốt hơn là viết mã không dựa vào thời gian của các cuộc gọi lại ngay lập tức (như microt Nhiệm vụ so với macrot Nhiệm vụ), nhưng hãy tạm gác chuyện đó sang một bên.
setTimeout
xếp hàng một macrotask, ở mức tối thiểu, chờ để bắt đầu cho đến khi tất cả các microt Nhiệm vụ (và microt Nhiệm vụ mà chúng sinh ra) kết thúc. Đây là một ví dụ:
console.log('Macrotask queued');
setTimeout(function() {
console.log('Macrotask running');
});
Promise.resolve()
.then(function() {
console.log('Microtask running');
});
console.log('Microtask queued');
console.log('Last line of script');
Hành vi của một .then
Lời hứa đã được giải quyết về cơ bản khác với hành vi của một setTimeout
cuộc gọi lại ngay lập tức - Lời hứa .then
sẽ chạy trước, ngay cả khi setTimeout
được xếp hàng trước. Nhưng chỉ có các trình duyệt hiện đại hỗ trợ Promising. Làm thế nào chức năng đặc biệt của microtask có thể được điền đầy đủ nếu Promise
không tồn tại?
Nếu bạn cố gắng bắt chước .then
microtask bằng cách sử dụng setTimeout
, bạn sẽ xếp hàng một macrotask, chứ không phải microtask, do đó, polyfills xấu .then
sẽ không chạy đúng lúc nếu macrotask đã được xếp hàng.
Có một giải pháp sử dụng MutationObserver
, nhưng nó trông xấu, và không phải MutationObserver
là để làm gì . Ngoài ra, MutationObserver
không được hỗ trợ trên IE10 và trước đó. Nếu một người muốn xếp hàng microtask trong môi trường không hỗ trợ Promise, liệu có lựa chọn nào tốt hơn không?
(Tôi thực sự không cố gắng hỗ trợ IE10 - đây chỉ là một bài tập lý thuyết về cách microt Nhiệm vụ có thể được xếp hàng mà không có Hứa hẹn)
schedule.js
sẽ được khai sáng.