Javascript 为什么代码中的catch语句没有捕获异步函数中的错误?

Javascript 为什么代码中的catch语句没有捕获异步函数中的错误?,javascript,node.js,async-await,Javascript,Node.js,Async Await,在承诺返回中,我定义了一个异步函数,从API获取一些数据。我陷入困境的部分是,当我抛出错误(强制)时,它不会被catch块捕获 据我所知,对于所有的.then语句,一个.catch就足够了。这是因为代码中有另一个异步函数,因此.catch不起作用吗 CampaignController.getOnboardingCampaignList = (req,res) => { return OnBoardingCampaign.find({description : {$exists

在承诺返回中,我定义了一个异步函数,从API获取一些数据。我陷入困境的部分是,当我抛出错误(强制)时,它不会被catch块捕获

据我所知,对于所有的.then语句,一个.catch就足够了。这是因为代码中有另一个异步函数,因此.catch不起作用吗

CampaignController.getOnboardingCampaignList = (req,res) => {

    return OnBoardingCampaign.find({description : {$exists : true}},{name: 1, description : 1, suggestedHaikuIds : 1})
    .then((r) => {
      // Some Logic here, unrelated the the work done below

        async function getSuggestedHaiku(){
            for(const campaign of r ){
                let suggestedHaikuIds = [];
                campaign.suggestedHaikus = [];
                throw new Error; // Using this to throw the new error
                if(campaign.suggestedHaikuIds === '') campaign.suggestedHaikuIds = [];
                else{
                    campaign.suggestedHaikuIds.forEach((id) => {
                        suggestedHaikuIds.push(Helper.parseId(id))
                    }) // This particular line threw the error initially
                    const result = await SuggestedHaiku.find({_id: {$in : suggestedHaikuIds}},{timeStamp : 0, deleted : 0, returnCount : 0, writtenCount : 0});

                    campaign.suggestedHaikus = result;
                }

            }

            if(r.length === 0){
                return Promise.reject(1001);
            }else{
                let result = {};
                result.list = r;
                Helper.success(res,"Onboarding Campaign List",result);
            }
        }
        getSuggestedHaiku();    


    })
    .catch(err => Helper.error(res, err)) // This catch did not catch the error thrown above

}
错误消息如下所示

未处理的PromisejectionWarning:错误 在getSuggestedHaiku(/Users/abhinav/haikuserver/controllers/campaign.js:242:23) 在OnBoardingCampaign.find.then(/Users/abhinav/haikuserver/controllers/campaign.js:263:9) 在进程中。_tick回调(内部/process/next_tick.js:68:7) 警告.js:18 (节点:7646)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:2) 警告.js:18
(节点:7646)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。

Javascript执行命令,而无需等待前面的函数/命令完成。当异步函数完成并抛出错误时,控制流已经移到catch块之前


因此,在发生错误/承诺拒绝时,事件循环中没有剩余的catch块来处理它。

Try catch应该被包装到for循环

try{

      for(const campaign of r ){}

}catch() {}

如果
返回getSuggestedHaiku()它会的-因为承诺就是这样工作的-您将承诺与异步/等待混合在一起。这会降低代码的可读性和维护难度。建议:选择一种方法并坚持下去@JaromandaX您的解决方案很有效,请您给我指出一个资源,我可以从中了解更多有关它的信息。我发现MDN文档非常有信息性。您可以参考此视频以更好地理解。从长远来看是值得的:如果您解释为什么“事件循环中没有剩余的catch块来处理它”,这将是一个答案。显然OP认为有一个。以及如何修复:)