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.
setTimeoutxế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 .thenLời hứa đã được giải quyết về cơ bản khác với hành vi của một setTimeoutcuộc gọi lại ngay lập tức - Lời hứa .thensẽ 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 Promisekhông tồn tại?
Nếu bạn cố gắng bắt chước .thenmicrotask 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 .thensẽ 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 MutationObserverlà để làm gì . Ngoài ra, MutationObserverkhô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.jssẽ được khai sáng.