Javascript 为什么代码中的catch语句没有捕获异步函数中的错误?
在承诺返回中,我定义了一个异步函数,从API获取一些数据。我陷入困境的部分是,当我抛出错误(强制)时,它不会被catch块捕获 据我所知,对于所有的.then语句,一个.catch就足够了。这是因为代码中有另一个异步函数,因此.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
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认为有一个。以及如何修复:)