Maison > Article > interface Web > Pourquoi Promise.all se résout-il prématurément avec des éléments non définis ?
Dans une application JavaScript, une fonction renvoie un tableau rempli d'éléments non définis lorsque en utilisant Promise.all. Ce problème survient avant que la fonction ne termine ses opérations. Voici la fonction problématique :
<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>
La fonction addText est identifiée comme la cause première du problème :
<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>
Pour résoudre le problème, vous devez n'oubliez pas de renvoyer les promesses dans le rappel de carte de Promise.all :
<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>
En ajoutant les instructions de retour manquantes, vous encapsulez désormais correctement chaque appel de base de données dans une promesse et renvoyez le résultat Promise.all lorsque toutes les promesses individuelles ont résolu. Cela garantit que la fonction getQueries reçoit le résultat correct lorsque toutes les requêtes sont récupérées et traitées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!