Javascript forEach吞咽异常
我试图使用javascript中的Javascript forEach吞咽异常,javascript,asynchronous,promise,async-await,es6-promise,Javascript,Asynchronous,Promise,Async Await,Es6 Promise,我试图使用javascript中的forEach循环和async回调在数组上循环。问题是,当我抛出一个异常时,它会 (node:2500) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise
forEach
循环和async
回调在数组上循环。问题是,当我抛出一个异常时,它会
(node:2500) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 6)
尽管我在forEach
之后有一个catch块。这是我的密码
async function func() {
try {
array.forEach(async (e) => {
try {
let bom = await BOMChild.findOne({
where: { id: e.id },
});
if (bom.BOMProductId || bom.BOMProductId === 0) {
throw {
name: " error",
description: `Description `,
};
}
} catch (e) {
throw e;
}
});
} catch (e) {
//exception caught
}
}
我做错了什么?解决这个问题的可能方法是什么。
TIA不幸的是,没有安全的方法将
async
回调与forEach
一起使用。最简单的解决方案是以async
的方式重新实现forEach
,如下所示。请注意,asyncForEach
本身返回一个承诺,因此您需要使用.then()
继续您的程序
const asyncForEach=async(数组,回调)=>{
试一试{
for(设i=0;i{
让bom=等待BOMChild.findOne({
其中:{id:e.id},
});
if(bom.BOMProductId | | bom.BOMProductId==0){
扔{
名称:“错误”,
description:`description`,
};
}
}).然后(()=>{
//继续节目。
});
如果你想用一种更干净,但更混乱的解决方案来测试你的承诺,看看a
promise.all()
那抛出e代码>不会抛出到.forEach
之外。我发现很难解释它是如何工作的。试着读一读关于lambda的内容,你到底做了什么。也许这会有所帮助:forEach
是一个调用您的实现的函数。我敢肯定,在forEach
中,是一个try-catch,它吸收了所有实现错误(比如异常,即使您抛出它),从而不会破坏forEach
@KunLun-No。您可以轻松地从回调中抛出异常来停止forEach
。这是对承诺的回报,而这些承诺将在以后被拒绝,这是没有帮助的。