Heim  >  Artikel  >  Web-Frontend  >  Warum wird Promise.all bei undefinierten Elementen vorzeitig aufgelöst?

Warum wird Promise.all bei undefinierten Elementen vorzeitig aufgelöst?

DDD
DDDOriginal
2024-10-30 07:40:17303Durchsuche

Why Does Promise.all Resolve Prematurely with Undefined Elements?

Promise.all löst sich vorzeitig mit undefinierten Elementen auf

Problembeschreibung

In einer JavaScript-Anwendung gibt eine Funktion ein Array zurück, das mit undefinierten Elementen gefüllt ist mit Promise.all. Dieses Problem tritt auf, bevor die Funktion ihre Vorgänge abschließt. Hier ist die problematische Funktion:

<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>

Die addText-Funktion wird als Hauptursache des Problems identifiziert:

<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>

Lösung

Um das Problem zu beheben, müssen Sie Denken Sie daran, Promises im Map-Callback von Promise.all zurückzugeben:

<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>

Durch das Hinzufügen der fehlenden Return-Anweisungen verpacken Sie jetzt jeden Datenbankaufruf ordnungsgemäß in ein Promise und geben das Promise.all-Ergebnis zurück, wenn alle einzelnen Promises dies getan haben gelöst. Dadurch wird sichergestellt, dass die getQueries-Funktion das richtige Ergebnis erhält, wenn alle Abfragen abgerufen und verarbeitet werden.

Das obige ist der detaillierte Inhalt vonWarum wird Promise.all bei undefinierten Elementen vorzeitig aufgelöst?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn