在 JavaScript 应用程序中,函数在以下情况下返回充满未定义元素的数组:使用 Promise.all。此问题在函数完成其操作之前出现。这是有问题的函数:
<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>
addText 函数被确定为问题的根本原因:
<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>
要解决此问题,您必须记得在 Promise.all 的映射回调中返回 Promise:
<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>
通过添加缺少的 return 语句,您现在可以正确地将每个数据库调用包装在 Promise 中,并在所有单独的 Promise 都满足时返回 Promise.all 结果解决了。这确保了 getQueries 函数在获取和处理所有查询时收到正确的结果。
以上是为什么 Promise.all 会因未定义的元素而过早解析?的详细内容。更多信息请关注PHP中文网其他相关文章!