Rumah  >  Artikel  >  hujung hadapan web  >  Mengapakah Promise.all Menyelesaikan Secara Pramatang dengan Unsur Tidak Ditakrifkan?

Mengapakah Promise.all Menyelesaikan Secara Pramatang dengan Unsur Tidak Ditakrifkan?

DDD
DDDasal
2024-10-30 07:40:17303semak imbas

Why Does Promise.all Resolve Prematurely with Undefined Elements?

Promise.all Menyelesaikan Secara Pramatang dengan Elemen yang tidak ditentukan

Penerangan Isu

Dalam aplikasi JavaScript, fungsi mengembalikan tatasusunan yang diisi dengan elemen yang tidak ditentukan apabila menggunakan Janji.semua. Isu ini timbul sebelum fungsi menyelesaikan operasinya. Berikut ialah fungsi bermasalah:

<code class="js">classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    // Fetch database.
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);

    // Functions here.
  });
};</code>

Fungsi addText dikenal pasti sebagai punca masalah:

<code class="js">function addText(queries) {
  // This line is missing the `return` keyword.
  Promise.all(queries.map(function(query) {
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: [ "query" ]
    })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Here, missing the `return` keyword in front of `Promise.resolve(query)`.
        return Promise.resolve(query);
      }, function(error) {
        // Missing `return Promise.reject(error);`
      });
  }));
};</code>

Penyelesaian

Untuk membetulkan isu, anda mesti ingat untuk mengembalikan Promises dalam Promise.all's map callback:

<code class="js">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Add `return` here to fix the problem.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Add `return` here.
        return Promise.resolve(query);
      }, function(error) {
        // Add `return` here.
        return Promise.reject(error);
      });
  }));
};</code>

Dengan menambahkan pernyataan pulangan yang hilang, anda kini dengan betul membungkus setiap panggilan pangkalan data dalam Promise dan mengembalikan Promise.all hasil apabila semua Promise individu mempunyai diselesaikan. Ini memastikan fungsi getQueries menerima hasil yang betul apabila semua pertanyaan diambil dan diproses.

Atas ialah kandungan terperinci Mengapakah Promise.all Menyelesaikan Secara Pramatang dengan Unsur 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