Heim  >  Artikel  >  Web-Frontend  >  Warum gibt Promise.all ein undefiniertes Array zurück und wird vorzeitig aufgelöst?

Warum gibt Promise.all ein undefiniertes Array zurück und wird vorzeitig aufgelöst?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 21:19:02693Durchsuche

Why is Promise.all Returning an Undefined Array and Resolving Prematurely?

Promise.all gibt ein undefiniertes Array zurück und löst es vorzeitig auf

Promise.all ist so konzipiert, dass es ein Array von Promise-Objekten akzeptiert und einmal alle auflöst Die Promises im Array wurden aufgelöst. Im bereitgestellten Code tritt das Problem jedoch auf, weil die an die Karte von Promise.all übergebene Rückruffunktion kein Promise zurückgibt.

Innerhalb der addText-Funktion:

<code class="javascript">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Missing `return` statement causes undefined values in the array
    models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);

        // Return the updated query as a resolved Promise
        return Promise.resolve(query);
      }, function(error) {
        // Return the error as a rejected Promise
        return Promise.reject(error);
      });
  }));
};</code>

Hier ist, was passiert :

  1. Der Map-Callback gibt kein Promise zurück, daher enthält das resultierende Array undefinierte Werte.
  2. Promise.all löst sofort das resultierende Array undefinierter Werte auf.
  3. Anschließend empfängt der .then()-Rückruf ein Array undefinierter Werte anstelle eines Arrays von Versprechen.

Um dieses Problem zu beheben und sicherzustellen, dass Promise.all erst nach allen Versprechen im Rückruf aufgelöst wird gelöst wurden, muss der Callback explizit Promises zurückgeben:

<code class="javascript">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Added `return` statement to wrap the Promise in the callback
    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);
      });
  }));
};</code>

Jetzt gibt der Map-Callback Promises zurück, die Promise.all erst dann ordnungsgemäß verarbeiten und auflösen kann, wenn alle Promises aufgelöst wurden.

Das obige ist der detaillierte Inhalt vonWarum gibt Promise.all ein undefiniertes Array zurück und wird 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