util.promisify请求在迭代中失败后继续.map循环异步等待

问题描述

我有下面的异步函数接收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();可以解决问题,但仍然无法对第一个迭代对象进行故障处理。

我想知道如何在执行查询中发现错误后继续实现.map循环。

请谢谢!

解决方法

不能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);
    }
}