我可以在不等待的情况下捕获异步方法的异常吗?

Can I catch exceptions from async methods without await?

如何在不抛出 await 的情况下捕获来自 doAsyncThing 的异常? doAsyncThing 的每个 运行 都是幂等的,所以我只希望所有操作都发生 "at the same time" 然后结束这个过程。我意识到即使我将 try/catch 放入 map 中,它实际上也不会在那里捕获它,因为此时它不在同一个线程中。

const promises  = entities.map(entity => {
  return entity.doAsyncThing();
});

await Promise.all(promises);

Can I catch exceptions from async methods without await?

不,try/catch 没有。在您的 map 回调完成时,您的异步任务甚至还没有完成。 promises 包含一组 未解决的 承诺(假设 doAsyncThing 实际上正在进行异步工作并且不直接 return 已解决或拒绝的承诺)。

根据您具体想要做什么,您有多种选择。

  • map中使用catch来单独处理每一件事:
const promises  = entities.map(entity => {
   return entity.doAsyncThing().catch(error => /* do something */);
});
await Promise.all(promises);
  • Promise.all 上使用 catch:
const promises  = entities.map(entity => {
   return entity.doAsyncThing();
});
Promise.all(promises).catch(error => /* do something */);
  • 使用try/catch:
const promises  = entities.map(entity => {
   return entity.doAsyncThing();
});
try {
    await Promise.all(promises)
} catch (ex) {
    // do something
};

取决于您要实现的目标。与您的代码相同但没有 await 将是

const promises  = entities.map(entity => {
  return entity.doAsyncThing();
});

Promise.all(promises).catch(e => {
  // handle exception
});

但是你需要明白,如果你的任何一个承诺被拒绝,它就会捕捉到,如果你所有的承诺都被解决,它就会被解决。

如果您想处理每个异常并获得已解决承诺的结果,您可能需要类似

的东西
const promises = entities.map(async entity => {
  try {
    return await entity.doAsyncThing();
  } catch (e) {
    // handle each exception
    return null;
  }
});

await Promise.all(promises);