是否可以在不等待的情况下从异步方法捕获异常?

时间:2019-10-03 16:20:57

标签: javascript node.js es6-promise

如何在不抛出await的情况下从doAsyncThing捕获异常? try/catch的每次运行都是幂等的,因此我只希望所有操作“同时”发生,然后完成整个过程。我意识到即使将map放在const promises = entities.map(entity => { return entity.doAsyncThing(); }); await Promise.all(promises); 内,它实际上也不会被捕获,因为那时它不在同一线程中。

USING

2 个答案:

答案 0 :(得分:2)

  

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

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

根据您要执行的操作,您有几种选择。

  • 使用catch中的map分别处理每件事:
const promises  = entities.map(entity => {
   return entity.doAsyncThing().catch(error => /* do something */);
});
await Promise.all(promises);
  • catch上使用Promise.all
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
};

答案 1 :(得分:1)

取决于您要实现的目标。与您的代码相同,但无需等待

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);