Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript forEach吞咽异常_Javascript_Asynchronous_Promise_Async Await_Es6 Promise - Fatal编程技术网

Javascript forEach吞咽异常

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

我试图使用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 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
。这是对承诺的回报,而这些承诺将在以后被拒绝,这是没有帮助的。