Rumah >hujung hadapan web >tutorial js >Mengapakah Perintah Pelaksanaan Janji Tidak Padan dengan Jangkaan dalam JavaScript?
Masalah:
Coretan berikut menunjukkan penggunaan JavaScript janji, dan susunan pelaksanaan adalah menarik.
<code class="javascript">Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);</code>
Hasilnya menunjukkan susunan pelaksanaan ialah:
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
Persoalan yang ditimbulkan ialah mengapa perintah pelaksanaan bukan 1, 2 , 3, 4..., dan bagaimana jangkaan 1, 2, 3, 4... berbeza daripada hasilnya?
Jawapan:
Ulasan:
Menjalankan janji dalam pengendali .then() tanpa mengembalikannya daripada panggilan balik .then() mencipta urutan janji baharu yang tidak dilampirkan yang tidak menyegerakkan dengan janji induk dalam mana-mana cara. Ini biasanya dianggap sebagai pepijat dan sesetengah enjin janji mengeluarkan amaran apabila ia berlaku, kerana ia biasanya bukan tingkah laku yang dimaksudkan. Kes penggunaan yang sah mungkin merupakan operasi 'fire and forget' yang tidak membimbangkan ralat mahupun penyegerakan.
Promise.resolve() berjanji dalam pengendali .then() mencipta rantai Promise baharu yang berjalan secara bebas daripada induk rantai. Dengan operasi tak segerak yang sebenar, seperti panggilan AJAX, tiada gelagat boleh diramal untuk rantai janji bebas dan terputus. Masa penyiapan adalah tidak tentu, seperti melancarkan empat panggilan AJAX selari di mana susunan penyiapan tidak diketahui. Dalam kod yang diberikan, semua operasi adalah segerak, menghasilkan gelagat yang konsisten, tetapi ini tidak boleh dipercayai kerana tujuan reka bentuk janji adalah pelaksanaan tak segerak.
Ringkasan:
Analisis Baris demi Baris:
Kesimpulan:
Ketiadaan perintah khusus dalam Promise.resolve() pelaksanaan janji dalam pengendali .then(), serta ketidakpastian penjadualan pengendali .then() berbanding setTimeout() untuk pelbagai enjin, menyerlahkan kepentingan mengawal perintah pelaksanaan melalui janji yang dirantai.
Atas ialah kandungan terperinci Mengapakah Perintah Pelaksanaan Janji Tidak Padan dengan Jangkaan dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!