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