Promise.all 是一个强大的工具,用于并发执行多个异步操作并聚合它们结果。但是,如果使用不当,可能会导致意外行为,例如使用未定义值的数组进行解析。
考虑给定的代码:
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); }); };
在这里,addText 函数在映射回调中的任何单个 Promise 被解析之前返回一个 Promise.all 未定义的值。这会导致 getQueries 解析为未定义的数组。
要在所有承诺完成后解析,请从每个映射回调返回承诺:
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); }); })); };
请记住,Promise.all 接受 Promise 对象的数组。未定义的值将立即解析,可能导致过早解析。始终返回每个单独操作的承诺,以确保正确的结果数组。
以上是为什么 Promise.all 解析时会出现未定义的值?的详细内容。更多信息请关注PHP中文网其他相关文章!