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