Perintah pelaksanaan Nested Promise
P粉459440991
P粉459440991 2023-08-16 19:20:33
0
2
586
<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>
P粉459440991
P粉459440991

membalas semua(2)
P粉770375450

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.

P粉493534105

Ringkasnya, ia adalah kerana susunan yang anda panggil .then.

new Promise((resolve) => {
    new Promise((res) => {
        console.log("c");
        resolve(3);
        res(2);

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.

}).then((response) => console.log(response))

Setelah selesai membina Janji batin, kami memanggil .then pada Janji batin. Memandangkan Janji telah diselesaikan, ini membuat baris gilir microtask untuk dijalankan.

}).then((res) => console.log(res));

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan