Promise.all ist ein leistungsstarkes Tool zum gleichzeitigen Ausführen mehrerer asynchroner Vorgänge und deren Aggregierung Ergebnisse. Bei unsachgemäßer Anwendung kann es jedoch zu unerwartetem Verhalten kommen, z. B. zur Auflösung mit einem Array undefinierter Werte.
Bedenken Sie den angegebenen Code:
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); }); };
Hier gibt die Funktion addText ein Promise.all mit undefinierten Werten zurück, bevor eines der einzelnen Versprechen im Map-Callback aufgelöst wird. Dies führt dazu, dass getQueries mit einem Array undefinierter Werte aufgelöst werden.
Zur Auflösung, nachdem alle Versprechen erfüllt sind, geben Sie das Versprechen von jedem Kartenrückruf zurück:
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); }); })); };
Denken Sie daran, dass Promise.all ein Array von Promise-Objekten akzeptiert. Undefinierte Werte werden sofort aufgelöst, was möglicherweise zu einer vorzeitigen Auflösung führt. Geben Sie immer das Versprechen jeder einzelnen Operation zurück, um eine korrekte Ergebnisauswahl zu gewährleisten.
Das obige ist der detaillierte Inhalt vonWarum wird Promise.all mit undefinierten Werten aufgelöst?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!