Maison >interface Web >js tutoriel >Pourquoi Promise.all résout-il avec des valeurs non définies ?
Promise.all est un outil puissant pour exécuter simultanément plusieurs opérations asynchrones et agréger leurs résultats. Cependant, s'il n'est pas utilisé correctement, cela peut entraîner un comportement inattendu, tel qu'une résolution avec un tableau de valeurs non définies.
Considérez le code donné :
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); }); };
Ici, la fonction addText renvoie un Promise.all de valeurs non définies avant que l'une des promesses individuelles du rappel de carte ne soit résolue. Cela provoque la résolution de getQueries avec un tableau de valeurs indéfinies.
Pour résoudre une fois que toutes les promesses sont remplies, renvoyez la promesse de chaque rappel de carte :
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); }); })); };
N'oubliez pas que Promise.all accepte un tableau d'objets Promise. Les valeurs non définies seront résolues immédiatement, ce qui pourrait entraîner une résolution prématurée. Renvoyez toujours la promesse de chaque opération individuelle pour garantir un ensemble correct de résultats.
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!