javascript - 为什么代码中的 catch 语句没有捕获异步函数中的错误?
问题描述
我在承诺返回中有一个 .then,并且我已经定义了一个从 API 获取一些数据的异步函数。我被卡住的部分是,当我抛出一个错误(强制)时,它不会被 catch 块捕获。
据我所知,一个 .catch 足以满足所有 .then 语句。这是因为代码中有另一个异步函数,因此 .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
}
错误信息如下
UnhandledPromiseRejectionWarning:在 OnBoardingCampaign.find.then (/Users/abhinav/haikuserver/controllers/campaign.js:263:9) 的 getSuggestedHaiku (/Users/abhinav/haikuserver/controllers/campaign.js:242:23) 处出错。 _tickCallback (internal/process/next_tick.js:68:7) warning.js:18 (node:7646) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。(拒绝 id:2)warning.js:18(节点:7646)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
解决方案
Try catch 应该被包裹到 for 循环中。
try{
for(const campaign of r ){}
}catch() {}
推荐阅读
- oracle - Oracle SQL 触发器 - 如何阻止调用触发器后发生的查询/过程
- batch-file - 如何使用批处理文件将文件重命名为增量顺序?
- git - Visual Studio Team Explorer - GIT:自动忽略新文件
- java - Shadow Root - 点击几个shadow root下的href
- c++ - QTableWidget 选择矩形即使在编辑完成后也不会消失
- scala - 当数组很大时,在 Scala 中的 Spark Dataframe 中从数组列创建单独的列
- python - OpenCV+python:从 3.4.2 开始访问 HoughLines 累加器
- r - R中聚类中心与异常值之间的距离
- mysql - 使用 NodeJS 从 MySQL 数据库中检索数据并将其传递给 AngularJS 页面
- java - GridLayout 和 CardView 无法在所有设备上完美运行