我在promise返回中有一个 .then,并且定义了一个从 API 获取一些数据的异步函数。我陷入困境的部分是,当我(强行)抛出错误时,它不会被捕获块捕获。
据我所知,单身。对所有人来说,捕到的已经足够了。然后陈述。这是因为代码中有另一个异步函数,因此。接球不灵了?
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
}
错误消息如下
UnhandledPromiseRejectionWarning:onboardingcampaign . find . then(/Users/abhi nav/haiku server/controllers/campaign . js:263:9)处的getSuggestedHaiku处出错。_ tick callback(internal/process/next _ tick . js:68:7)warning . js:18(node:7646)UnhandledPromiseRejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数内部,或者拒绝未用处理的promise。catch()。(拒绝id:2)warning . js:18(node:7646)[dep 0018]deprecation warning:不赞成使用未处理的promise拒绝。将来,未被处理的promise拒绝将使用非零退出代码终止Node.js进程。
尝试捕获应包装到 for 循环。
try{
for(const campaign of r ){}
}catch() {}
Javascript执行命令时不一定要等待前面的函数/命令完成。当您的异步函数完成并抛出错误时,控制流已经领先于catch块。
因此,当发生错误/promise拒绝时,事件循环中没有剩余的捕获块来处理它。