Rumah  >  Artikel  >  hujung hadapan web  >  Mengapakah Promise.all Mengembalikan Susunan Yang Tidak Ditakrifkan dan Menyelesaikan Lebih Awal?

Mengapakah Promise.all Mengembalikan Susunan Yang Tidak Ditakrifkan dan Menyelesaikan Lebih Awal?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 21:19:02693semak imbas

Why is Promise.all Returning an Undefined Array and Resolving Prematurely?

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 :

  1. Panggil balik peta tidak mengembalikan Promise, jadi tatasusunan yang terhasil mengandungi nilai yang tidak ditentukan.
  2. Promise.all segera menyelesaikan tatasusunan nilai yang tidak ditentukan yang terhasil.
  3. Seterusnya, panggilan balik .then() menerima tatasusunan nilai yang tidak ditentukan dan bukannya tatasusunan Janji.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn