我可以在不等待的情况下捕获异步方法的异常吗?
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);
如何在不抛出 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);