Mengapakah Promise.all menyelesaikan dengan tatasusunan nilai yang tidak ditentukan apabila menggunakan fungsi async dalam peta?

DDD
Lepaskan: 2024-11-02 09:27:02
asal
673 orang telah melayarinya

Why is Promise.all resolving with an array of undefined values when using async functions within a map?

Promise.all Menyelesaikan Array of Undefined: Membongkar Misteri

Promise menyediakan model pengaturcaraan tak segerak, membolehkan kebolehbacaan kod dan kawalan aliran yang dipertingkatkan. Namun, kadangkala, timbul isu yang tidak dijangka. Soalan ini meneroka sebab Promise.all mengembalikan susunan yang tidak ditentukan dan menyelesaikannya lebih awal.

Kod yang dipersoalkan mengikut corak rantai janji biasa:

<code class="javascript">const getQueries = (models, dbId, dateStart, dateEnd) => {
  return new Promise((resolve, reject) => {
    // Fetch database and perform operations
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then((queries) => {
        console.log("getQueries finished", queries);
        resolve(queries);
      }, reject);
  });
};</code>
Salin selepas log masuk

Selepas berjaya melengkapkan permulaan operasi, isu timbul dalam fungsi addText:

<code class="javascript">const addText = (queries) => {
  return Promise.all(queries.map((query) => {
    // Oops! We're missing a `return` here!
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: ["query"],
    })
      .then((queryFetched) => {
        query.text = queryFetched.query;
        console.log(query);

        return Promise.resolve(query);
      }, (error) => {
        return Promise.reject(error);
      });
  }));
};</code>
Salin selepas log masuk

Punca masalah terletak pada pernyataan pulangan yang hilang dalam fungsi panggil balik peta. Promise.all menjangkakan tatasusunan objek Promise, tetapi tanpa pemulangan, panggilan balik itu kembali tidak ditentukan untuk setiap elemen dalam tatasusunan pertanyaan.

Akibatnya, Promise.all segera menyelesaikan dengan tatasusunan yang tidak ditentukan, walaupun sebelum ini Janji sebenar di dalam peta mempunyai peluang untuk diselesaikan. Penyelesaian pramatang ini membawa kepada tingkah laku yang tidak dijangka dan pelbagai nilai yang tidak ditentukan.

Untuk membetulkan isu tersebut, adalah penting untuk menambah pernyataan pemulangan sebelum setiap panggilan Janji dalam fungsi addText:

<code class="javascript">const addText = (queries) => {
  return Promise.all(queries.map((query) => {
    return models.queries.findById(query.queryId, {
      raw: true,
      attributes: ["query"],
    })
      .then((queryFetched) => {
        query.text = queryFetched.query;
        console.log(query);

        return Promise.resolve(query);
      }, (error) => {
        return Promise.reject(error);
      });
  }));
};</code>
Salin selepas log masuk

Sekarang, Promise.all akan menunggu dengan betul semua Promise dalam tatasusunan diselesaikan, menghasilkan output yang dijangkakan yang mengandungi hasil pertanyaan.

Atas ialah kandungan terperinci Mengapakah Promise.all menyelesaikan dengan tatasusunan nilai yang tidak ditentukan apabila menggunakan fungsi async dalam peta?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan