如果通过Promise.all处理数据时出现错误,则在catch语句中捕获单个记录

Capture individual record in catch statement if any error occurs while processing data through Promise.all

我正在使用 Promise.all 处理多条记录,如果出现任何错误,我想在 catch 语句中捕获单个记录

我写了一个方法callApi 现在我在主代码中调用callApi方法

try {
 let result = await callApi(res)
}
catch (err) {

}

async function callApi(records) {
  return Promise.all(
    records.map(async record => {
        await processRecord(record)
    })
  )
}

如果发生任何错误,我想 display/capture 在 catch 块中单独记录 以下为

try {
 let result = await callApi(res)
}
catch (err) {
 console.log('Got error while processing this record', record)
}

但是我将如何在 catch 块中获取记录变量

因为它可能会抛出 processRecord,如果您希望它正在处理的记录是被捕获的,而不是实际的错误,catch processRecord 错误,并且 throw 记录:

function callApi(records) {
  return Promise.all(
    records.map(record => (
      processRecord(record)
        .catch((err) => {
          throw record;
        })
    ))
  )
}

可能对return捕获时的记录和错误都有用,不过:

try {
  let result = await callApi(res)
} catch ({ err, record }) { // <--------
  console.log('Got error while processing this record', record);
  console.log(err);
}

function callApi(records) {
  return Promise.all(
    records.map(record => (
      processRecord(record)
        .catch((err) => {
          throw { err, record };
        })
    ))
  )
}

请注意,因为 callApi 已经明确地 return 是一个 Promise,所以没有必要使它成为一个 async 函数。

要等待所有请求完成,然后检查每个请求的错误,请执行以下操作:

function callApi(records) {
  return Promise.all(
    records.map(record => (
      processRecord(record)
        .then(value => ({ status: 'fulfilled', value }))
        .catch(err => ({ status: 'rejected', reason: { record, err } }))
    ))
  );
}

const result = await callApi(res);
const failures = result.filter(({ status }) => status === 'rejected');
failures.forEach(({ reason: { record, err } }) => {
  // record failed for reason err
});