Saya memikirkannya dan inilah yang saya pikirkan:
Katakanlah kita memiliki kode seperti ini:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Permintaan masuk, dan mesin JS mulai mengeksekusi kode di atas langkah demi langkah. Dua panggilan pertama adalah panggilan sinkronisasi. Tetapi ketika datang ke setTimeout
metode, itu menjadi eksekusi async. Tetapi JS segera kembali darinya dan melanjutkan eksekusi, yang disebut Non-Blocking
atau Async
. Dan itu terus bekerja pada yang lain dll.
Hasil dari eksekusi ini adalah sebagai berikut:
acdb
Jadi pada dasarnya yang kedua setTimeout
diselesaikan terlebih dahulu dan fungsi callback dijalankan lebih awal dari yang pertama dan itu masuk akal.
Kita berbicara tentang aplikasi single-threaded di sini. JS Engine terus menjalankan ini dan kecuali itu menyelesaikan permintaan pertama, itu tidak akan pergi ke yang kedua. Tetapi hal baiknya adalah bahwa ia tidak akan menunggu untuk memblokir operasi yang ingin setTimeout
diselesaikan sehingga akan lebih cepat karena menerima permintaan masuk yang baru.
Tetapi pertanyaan saya muncul di sekitar item berikut:
# 1: Jika kita berbicara tentang aplikasi single-threaded, lalu mekanisme apa yang diproses setTimeouts
saat mesin JS menerima lebih banyak permintaan dan menjalankannya? Bagaimana utas tunggal terus bekerja pada permintaan lain? Apa yang berfungsi setTimeout
saat permintaan lainnya terus masuk dan dieksekusi.
# 2: Jika setTimeout
fungsi - fungsi ini dieksekusi di belakang layar saat lebih banyak permintaan masuk dan dieksekusi, apa yang melakukan eksekusi async di belakang layar? Benda apa yang kita bicarakan ini disebut EventLoop
?
# 3: Tapi bukankah seluruh metode harus dimasukkan EventLoop
sehingga semuanya dieksekusi dan metode panggilan balik dipanggil? Inilah yang saya mengerti ketika berbicara tentang fungsi callback:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Tetapi dalam kasus ini, bagaimana JS Engine tahu jika itu adalah fungsi async sehingga dapat menempatkan panggilan balik dalam EventLoop? Perhaps something like the
kata kunci async` dalam C # atau semacam atribut yang menunjukkan metode yang akan diambil oleh Mesin JS adalah metode async dan harus diperlakukan sebagaimana mestinya.
# 4: Tapi sebuah artikel mengatakan sangat bertentangan dengan apa yang saya duga tentang bagaimana segala sesuatunya bekerja:
Loop Peristiwa adalah antrian fungsi panggilan balik. Ketika fungsi async dijalankan, fungsi callback didorong ke antrian. Mesin JavaScript tidak mulai memproses loop acara hingga kode setelah fungsi async dijalankan.
# 5: Dan ada gambar ini di sini yang mungkin bisa membantu tetapi penjelasan pertama dalam gambar mengatakan hal yang persis sama yang disebutkan dalam pertanyaan nomor 4:
Jadi pertanyaan saya di sini adalah untuk mendapatkan klarifikasi tentang barang-barang yang tercantum di atas?