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