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.
setTimeout
mengantri 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 .then
pada Janji yang diselesaikan pada dasarnya berbeda dari perilaku setTimeout
panggilan balik segera - Janji .then
akan berjalan terlebih dahulu, bahkan jika yang setTimeout
antri dulu. Tetapi hanya browser modern yang mendukung Janji. Bagaimana fungsi khusus microtask dapat diisi dengan benar jika Promise
tidak ada?
Jika Anda mencoba meniru .then
mikrotask dengan menggunakan setTimeout
, Anda akan mengantri macrotask, bukan mikrotask, sehingga polyfilled yang buruk .then
tidak akan berjalan pada waktu yang tepat jika macrotask sudah antri.
Ada solusi yang digunakan MutationObserver
, tetapi terlihat jelek, dan bukan untuk apa MutationObserver
. Juga, MutationObserver
tidak 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.js
akan sangat mencerahkan.