问题描述
我有下面的异步函数接收4个对象的数组。第一个在.map循环中处理,该循环执行查询并导致错误(在await executeQuery(queryString)中)。当第一个对象完成处理后,循环结束,其他三个对象未处理。
async function myFunction(arrayOfObjects,param1) {
const promises = arrayOfObjects.map(async function (currElement,i) {
var queryString = 'www.querystring.com?APIparameter=param1';
const executeQuery = util.promisify(request);
await executeQuery(queryString).then(data => {
//process data here using currElement,i
}).catch(err => console.log('error: ',err));
});
await Promise.all(promises).catch();
}
我最初只等待Promise.all(promises),并考虑将其修改为等待Promise.all(promises).catch();可以解决问题,但仍然无法对第一个迭代对象进行故障处理。
请谢谢!
解决方法
不能100%确定这段代码会发生什么,但是有些事情我会改变。首先,在循环中使用<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root'></div>
不是一个好习惯,其次,在循环中每个承诺都得到解决之前,await
可能不是您期望的promises
数组,因为await
会屈服。从Promise
函数返回map
以生成Promises
的数组,每个数组都将在自己的时间内解析和处理数据。然后,您可以await
使用try/catch
兑现所有承诺并捕获任何错误。类似于以下内容的内容应该可以满足您的期望...
async function myFunction(arrayOfObjects,param1) {
const executeQuery = util.promisify(request);
const promises = arrayOfObjects.map((currElement,i) => {
const queryString = 'www.querystring.com?APIparameter=param1';
return executeQuery(queryString).then(data => {
// process data here using currElement,i
});
});
try {
await Promise.all(promises);
// all promises will be resolved here
} catch (err) {
console.log('error: ',err);
}
}