Perintah pelaksanaan Nested Promise
P粉459440991
2023-08-16 19:20:33
<p>Saya sedang membaca tentang janji bersarang dan menemui cabaran pengekodan ini dalam tutorial. Bolehkah sesiapa menerangkan perintah pelaksanaan kod ini? </p>
<pre class="brush:php;toolbar:false;">new Promise((resolve) => {
Janji baharu((res) => {
console.log("c");
menyelesaikan (3);
res(2);
}).then((respons) => console.log(respons))
}).then((res) => console.log(res));</pre>
<p>Saya menjalankan kod ini dan outputnya ialah: </p>
<pre class="brush:php;toolbar:false;">c
2
3</pra>
<p>Tetapi saya menjangkakan outputnya ialah: </p>
<pre class="brush:php;toolbar:false;">c
3
2</pra>
<p>Kerana janji lahiriah diselesaikan dahulu, barulah janji batin diselesaikan kemudian. </p>
Selain jawapan Nicholas, anda mungkin terperangkap dengan penggunaan berulang 'res' pengecam. Penggunaan pertama Promise secara dalaman adalah sebagai fungsi panggil balik, yang mengembalikan nilai 2 kepada Promise. Penggunaan kedua dalam baris terakhir berada dalam skop yang berbeza dan digunakan sebagai nama parameter untuk kaedah .then() Promise luar. Ia mungkin membantu jika anda menggantikan 'res' dalam baris terakhir dengan 'outerPromiseResult', untuk menjelaskan perkara.
Ringkasnya, ia adalah kerana susunan yang anda panggil
.then
.Dalam kod di atas, kami memasukkan pembina luar, yang segera memanggil fungsi luar. Kemudian buat Janji dalaman dan panggil fungsi dalaman. Fungsi dalaman merekodkan "c", kemudian menyelesaikan Janji luar kepada 3, kemudian menyelesaikan Janji dalaman kepada 2.
Jadi pada ketika ini kami mempunyai 2 Janji yang diselesaikan, tetapi tiada kod cuba menggunakannya.
Setelah selesai membina Janji batin, kami memanggil
.then
pada Janji batin. Memandangkan Janji telah diselesaikan, ini membuat baris gilir microtask untuk dijalankan.Selepas selesai membina Janji luaran, kami memanggil
.then
pada Janji luaran. Memandangkan Janji telah diselesaikan, ini membuat baris gilir microtask untuk dijalankan.Sekarang kami telah selesai menjalankan semua kod segerak. Timbunan panggilan kosong dan microtask mula berjalan. Ini dilaksanakan dalam urutan masuk dahulu, keluar dahulu, jadi tugas mikro yang berkaitan dengan Janji dalaman dijalankan dahulu, rekod 2. Kemudian jalankan microtasks yang tinggal dan rekod 3.