Lebih baik menulis kode yang tidak bergantung pada waktu panggilan balik langsung (seperti microtasks vs macrotasks), tetapi mari kita kesampingkan hal itu untuk sementara waktu.
setTimeoutmengantri macrotask, yang, setidaknya, menunggu untuk memulai sampai semua mikrotasks (dan mikrotasks yang mereka hasilkan) selesai. Ini sebuah contoh:
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');
Perilaku a .thenpada Janji yang diselesaikan pada dasarnya berbeda dari perilaku setTimeoutpanggilan balik segera - Janji .thenakan berjalan terlebih dahulu, bahkan jika yang setTimeoutantri dulu. Tetapi hanya browser modern yang mendukung Janji. Bagaimana fungsi khusus microtask dapat diisi dengan benar jika Promisetidak ada?
Jika Anda mencoba meniru .thenmikrotask dengan menggunakan setTimeout, Anda akan mengantri macrotask, bukan mikrotask, sehingga polyfilled yang buruk .thentidak akan berjalan pada waktu yang tepat jika macrotask sudah antri.
Ada solusi yang digunakan MutationObserver, tetapi terlihat jelek, dan bukan untuk apa MutationObserver. Juga, MutationObservertidak didukung pada IE10 dan sebelumnya. Jika seseorang ingin mengantri microtask di lingkungan yang tidak mendukung Janji, apakah ada alternatif yang lebih baik?
(Saya tidak benar - benar mencoba untuk mendukung IE10 - ini hanya latihan teoretis tentang bagaimana microtasks dapat diantrekan tanpa Janji)
schedule.jsakan sangat mencerahkan.