Masalah
Pertimbangkan kod JavaScript berikut yang menggunakan janji:
<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>
Outputnya adalah seperti berikut:
<code class="text">1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6</code>
Soalannya ialah mengenai susunan pelaksanaan, khususnya nombor 1, 2, 3, 7, dan seterusnya. Mengapakah ia bukan susunan linear 1, 2, 3, 4, ...?
Janji JavaScript mengikut peraturan pelaksanaan tertentu:
Dalam kod yang diberikan:
Memandangkan rantai janji bebas yang dibuat dalam pengendali .then() tidak mempunyai perintah pelaksanaan yang boleh diramal, susunan 3, 7, 4, 8, 9, 5, 10 bergantung pada pelaksanaan enjin janji khusus.
Untuk memastikan perintah pelaksanaan khusus untuk operasi tak segerak, disyorkan untuk:
Dalam contoh yang diberikan, mengembalikan janji Promise.resolve('C') daripada .then( ) pengendali pada baris 4 akan memautkan rantai janji dan menghasilkan susunan pelaksanaan berurutan yang dijangkakan.
Atas ialah kandungan terperinci Mengapakah perintah pelaksanaan JavaScript Promise tidak linear seperti yang dijangkakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!