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

Linda Hamilton
Lepaskan: 2024-10-31 21:19:02
asal
692 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!