Rumah  >  Soal Jawab  >  teks badan

Perintah pelaksanaan Nested Promise

<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粉459440991P粉459440991451 hari yang lalu561

membalas semua(2)saya akan balas

  • P粉770375450

    P粉7703754502023-08-17 16:48:21

    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.

    balas
    0
  • P粉493534105

    P粉4935341052023-08-17 15:42:59

    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.

    balas
    0
  • Batalbalas