Rumah  >  Artikel  >  hujung hadapan web  >  Mengapakah Promise.all Menyelesaikan dengan Nilai yang Tidak Ditakrifkan?

Mengapakah Promise.all Menyelesaikan dengan Nilai yang Tidak Ditakrifkan?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 09:10:02343semak imbas

Why Does Promise.all Resolve with Undefined Values?

Menyelesaikan Janji.all Awal: Mengelakkan Array Tidak Ditakrifkan

Ikhtisar

Promise.all ialah alat yang berkuasa untuk melaksanakan berbilang operasi tak segerak dan agregat mereka secara serentak keputusan. Walau bagaimanapun, jika tidak digunakan dengan betul, ia boleh mengakibatkan tingkah laku yang tidak dijangka, seperti menyelesaikan dengan pelbagai nilai yang tidak ditentukan.

Masalah

Pertimbangkan kod yang diberikan:

classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    ...
    then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);
  });
};

Di sini, fungsi addText mengembalikan Promise.semua nilai yang tidak ditentukan sebelum mana-mana janji individu dalam panggilan balik peta diselesaikan. Ini menyebabkan getQueries menyelesaikan dengan tatasusunan yang tidak ditentukan.

Penyelesaian

Untuk menyelesaikan selepas semua janji dipenuhi, kembalikan janji daripada setiap panggilan balik peta:

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Return the promise to delay resolution until the operation succeeds/fails.
    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);
      });
  }));
};

Mengelakkan Tidak ditentukan dalam Promise.all

Ingat, Promise.all menerima pelbagai objek Promise. Nilai yang tidak ditentukan akan diselesaikan serta-merta, yang berpotensi menyebabkan penyelesaian pramatang. Sentiasa kembalikan janji daripada setiap operasi individu untuk memastikan susunan keputusan yang betul.

Atas ialah kandungan terperinci Mengapakah Promise.all Menyelesaikan dengan Nilai yang Tidak Ditakrifkan?. 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