Mengapakah Promise.all Menyelesaikan dengan Nilai yang Tidak Ditakrifkan?

Linda Hamilton
Lepaskan: 2024-10-31 09:10:02
asal
342 orang telah melayarinya

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

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

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!

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!