Promise 提供了异步编程模型,从而提高了代码可读性和流程控制。然而,有时会出现意想不到的问题。这个问题探讨了为什么 Promise.all 返回未定义的数组并过早解析。
有问题的代码遵循典型的承诺链模式:
<code class="javascript">const getQueries = (models, dbId, dateStart, dateEnd) => { return new Promise((resolve, reject) => { // Fetch database and perform operations .then(extractQueries, reject) .then(sortQueries, reject) .then(onlyTen, reject) .then(addText, reject) .then((queries) => { console.log("getQueries finished", queries); resolve(queries); }, reject); }); };</code>
成功完成初始操作后操作中,问题出现在addText函数中:
<code class="javascript">const addText = (queries) => { return Promise.all(queries.map((query) => { // Oops! We're missing a `return` here! models.queries.findById(query.queryId, { raw: true, attributes: ["query"], }) .then((queryFetched) => { query.text = queryFetched.query; console.log(query); return Promise.resolve(query); }, (error) => { return Promise.reject(error); }); })); };</code>
问题的根本原因在于map回调函数中缺少return语句。 Promise.all 需要一个 Promise 对象数组,但如果没有返回,回调会为查询数组中的每个元素返回 undefined。
因此,Promise.all 立即解析为一个 undefined 数组,甚至在之前地图内的实际承诺有机会解决。这种过早的解决方案会导致意外的行为和一组未定义的值。
要纠正此问题,在 addText 函数中的每个 Promise 调用之前添加 return 语句至关重要:
<code class="javascript">const addText = (queries) => { return Promise.all(queries.map((query) => { return models.queries.findById(query.queryId, { raw: true, attributes: ["query"], }) .then((queryFetched) => { query.text = queryFetched.query; console.log(query); return Promise.resolve(query); }, (error) => { return Promise.reject(error); }); })); };</code>
现在,Promise.all 将正确等待数组中的所有 Promise 解析,从而产生包含查询结果的预期输出。
以上是在映射中使用异步函数时,为什么 Promise.all 会解析为未定义值的数组?的详细内容。更多信息请关注PHP中文网其他相关文章!