Saya baru saja selesai membaca spesifikasi Janji / A + dan menemukan istilah microtask dan macrotask: lihat http://promisesaplus.com/#notes
Saya belum pernah mendengar istilah ini sebelumnya, dan sekarang saya ingin tahu apa bedanya?
Saya sudah mencoba menemukan beberapa informasi di web, tetapi yang saya temukan hanyalah posting ini dari Arsip w3.org (yang tidak menjelaskan perbedaannya kepada saya): http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html
Selain itu, saya telah menemukan modul npm yang disebut "macrotask": https://www.npmjs.org/package/macrotask Sekali lagi, tidak dijelaskan apa bedanya sebenarnya.
Yang saya tahu adalah, bahwa itu ada hubungannya dengan loop acara, seperti yang dijelaskan dalam https://html.spec.whatwg.org/multipage/webappapis.html#task-queue dan https: //html.spec.whatwg .org / multipage / webappapis.html # perform-a-microtask-checkpoint
Saya tahu saya secara teoritis harus dapat mengekstraksi perbedaan sendiri, mengingat spesifikasi WHATWG ini. Tapi saya yakin orang lain juga bisa mendapat manfaat dari penjelasan singkat yang diberikan oleh seorang ahli.
sumber
while (task = todo.shift()) task();
Jawaban:
Satu putaran event loop akan memiliki satu tugas yang sedang diproses dari antrian macrotask (antrian ini hanya disebut antrian tugas dalam spesifikasi WHATWG ). Setelah macrotask ini selesai, semua microtasks yang tersedia akan diproses, yaitu dalam siklus go-around yang sama. Sementara mikrotasks ini diproses, mereka dapat mengantri lebih banyak mikrotasks, yang semuanya akan dijalankan satu per satu, hingga antrian mikrotask habis.
Apa konsekuensi praktis dari ini?
Jika mikrotask secara antri mengantri mikrotas lainnya, mungkin perlu waktu lama hingga macrotask berikutnya diproses. Ini berarti, Anda dapat berakhir dengan UI yang diblokir, atau pemalasan I / O yang selesai di aplikasi Anda.
Namun, setidaknya mengenai fungsi Node.js's process.nextTick (yang membuat antrian mikrotasks ), ada perlindungan bawaan terhadap pemblokiran semacam itu melalui proses.maxTickDepth. Nilai ini diatur ke default 1000, mengurangi pemrosesan mikrotasks lebih lanjut setelah batas ini tercapai yang memungkinkan macrotask berikutnya diproses)
Jadi kapan harus menggunakan apa?
Pada dasarnya, gunakan microtasks ketika Anda perlu melakukan hal-hal secara asinkron dengan cara yang sinkron (yaitu ketika Anda akan mengatakan melakukan tugas (mikro) ini di masa depan yang paling cepat ). Kalau tidak, tetap menggunakan macrotasks .
Contohnya
macrotasks: setTimeout , setInterval , setImmediate , requestAnimationFrame , I / O , UI rendering
microtasks: process.nextTick , Janji , antrianMicrotask , MutationObserver
sumber
process.maxTickDepth
telah dihapus sejak lama: github.com/nodejs/node/blob/…Konsep dasar dalam spesifikasi :
Dan model proses loop acara adalah sebagai berikut:
ketika tumpukan panggilan kosong, lakukan langkah-
model proses yang disederhanakan adalah sebagai berikut:
sesuatu untuk diingat:
sumber
setImmediate()
adalah makro / tugas, danprocess.nextTick()
merupakan mikro / pekerjaan.paint
tugas browser ? Dalam kategori apa mereka akan cocok?requestAnimationFrame
)Saya pikir kita tidak bisa membahas event loop terpisah dari stack, jadi:
JS memiliki tiga "tumpukan":
Dan loop acara berfungsi seperti ini:
Mico stack tidak akan disentuh jika stack tidak kosong. Tumpukan makro tidak akan disentuh jika tumpukan mikro tidak kosong ATAU tidak memerlukan eksekusi apa pun.
Singkatnya: antrian mikrotask hampir sama dengan antrian macrotask tetapi tugas-tugas itu (process.nextTick, Promises, Object.observe, MutationObserver) memiliki prioritas lebih tinggi daripada macrotasks.
Mikro seperti makro tetapi dengan prioritas lebih tinggi.
Di sini Anda memiliki kode "pamungkas" untuk memahami segalanya.
sumber