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)
sumber
schedule.js
akan sangat mencerahkan.Jawaban:
Jika kita berbicara tentang IE yang dapat Anda gunakan
setImmediate
https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate
setImmediate
didukung pada IE10. Jadi ditambah satu versi IE.Dan, jika Anda tertarik, plus Node.js.
Ada kemungkinan polyfill lain, berikut beberapa implementasinya: https://github.com/YuzuJS/setImmediate/blob/master/setImmediate.js (yang ini disebutkan dalam MDN) https://github.com/taylorhakes/ setAsap / blob / master / setAsap.js (yang lebih sederhana)
Dan karena hampir semua polyfill mereka jelek juga.
Tapi bagaimanapun, ini adalah contoh dalam esensinya (menggunakan postMessage), dan saya pikir itu paling jelek dari semua (tetapi juga bukan polyfill yang benar)
sumber
Saya melihat bahwa
mutationObserver
callback menggunakan microtasks, dan untungnya, IE11 mendukungnya, jadi saya punya ide untuk mengantri microtask di IE11 dengan menyimpan callback dan kemudian segera memicu pengamat dengan mengubah elemen:Anda dapat membuka IE11 dan melihat cara kerjanya di atas, tetapi kodenya terlihat aneh.
sumber