Promise.all Mengembalikan Susunan Tidak Ditakrifkan dan Menyelesaikan Lebih Awal
Promise.all direka bentuk untuk menerima pelbagai objek Promise dan menyelesaikan sekali semua Janji dalam tatasusunan telah diselesaikan. Walau bagaimanapun, dalam kod yang disediakan, isu timbul kerana fungsi panggil balik yang dihantar ke peta Promise.all tidak mengembalikan Promise.
Dalam fungsi addText:
<code class="javascript">function addText(queries) { return Promise.all(queries.map(function(query) { // Missing `return` statement causes undefined values in the array models.queries .findById(query.queryId, { raw: true, attributes: [ "query" ] }) .then(function(queryFetched) { query.text = queryFetched.query; console.log(query); // Return the updated query as a resolved Promise return Promise.resolve(query); }, function(error) { // Return the error as a rejected Promise return Promise.reject(error); }); })); };</code>
Berikut ialah perkara yang berlaku :
Untuk menyelesaikan isu ini dan memastikan Promise.all selesai hanya selepas semua Promise dalam panggilan balik diselesaikan, panggilan balik mesti secara eksplisit mengembalikan Promises:
<code class="javascript">function addText(queries) { return Promise.all(queries.map(function(query) { // Added `return` statement to wrap the Promise in the callback return models.queries .findById(query.queryId, { raw: true, attributes: [ "query" ] }) .then(function(queryFetched) { query.text = queryFetched.query; console.log(query); return Promise.resolve(query); }, function(error) { return Promise.reject(error); }); })); };</code>
Kini, panggilan balik peta mengembalikan Promises, yang Promise.all boleh mengendalikan dan menyelesaikan dengan betul hanya setelah semua Promise telah diselesaikan.
Atas ialah kandungan terperinci Mengapakah Promise.all Mengembalikan Susunan Yang Tidak Ditakrifkan dan Menyelesaikan Lebih Awal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!