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

Javascript 我可以在不等待的情况下捕获异步方法的异常吗?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,如何从doasynchThing捕获异常,而不在中抛出wait?每次运行doasynchThing都是幂等的,所以我只希望所有操作“同时”发生&然后结束这个过程。我意识到,即使我把一个try/catch放在map中,它实际上也不会在那里捕捉到它,因为它不在同一个线程中 const promises = entities.map(entity => { return entity.doAsyncThing(); }); await Promise.all(promises); 我可

如何从
doasynchThing
捕获异常,而不在中抛出
wait
?每次运行
doasynchThing
都是幂等的,所以我只希望所有操作“同时”发生&然后结束这个过程。我意识到,即使我把一个
try/catch
放在
map
中,它实际上也不会在那里捕捉到它,因为它不在同一个线程中

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

await Promise.all(promises);
我可以在不等待的情况下捕获异步方法的异常吗

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

根据您想要做什么,您有几个选择

  • 使用
    map
    中的
    catch
    单独处理每件事:
  • 使用
    Promise上的
    catch
    。所有
  • 使用
    try
    /
    catch

这取决于你想要达到的目标。与您的代码相同,但没有等待将是

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

我认为Promise.all的工作方式是,您必须传递一个将要执行的请求数组,entyty.doAsyncThing是否返回一个请求?。检查文档@RicardoGonzalez-不,这是不正确的
Promise.all()
接受承诺数组。异步操作完成时会通知承诺。异步操作已在调用
Promise.all()
的点开始。没有涉及“请求数组”。是否
doasynchThing()
返回承诺?
doAsyncThing()
能否同步抛出?如果对
doAsyncThing()
的一个调用失败,您想做什么(考虑到对它的其他调用已经并行运行)?看到
.map
建议很有趣。我也考虑过这一点,但不确定这是否是一种预期/保证的行为。但它确实有效。
const promises  = entities.map(entity => {
   return entity.doAsyncThing();
});
try {
    await Promise.all(promises)
} catch (ex) {
    // do something
};
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);