如何从promise内部的async/await返回错误



我最初用promise编写代码,但由于for循环,不得不使用async/await。

代码现在可以工作了,但我不知道如何抛出相当于拒绝承诺的错误。

let createGroup=(data)=>{
return new Promise((resolve,reject)=>{
if(check.isEmpty(data.groupName)){
reject('GroupId not Valid');
}
else{
let newGroup= new ExpenseModel({
groupId:'G-'+shortid.generate(),
groupName:data.groupName,
contributors:data.contributorObjIds,
timeCreated:time.now().format(),
creator:data.ownerId
})
newGroup.save((err,group)=>{
if(err){
reject(`Group Not Created ${err}`);
}else{
data.groupdata=group;
console.log("group created",data);
resolve(data);
}
})
}
})
}
let updateUserData= async (data)=>{
try{
for(user of data.contributorIds){
const res=await UserModel.findOne({'userId':user});
res.groups.push(data.groupdata._id);
const resSave=await res.save();
let id='GroupCreated'+user;
eventEmitter.emit('getGroup',user);    
}
return 1;
}
catch(e){
return e;
}
}

createGroup(data)
.then(updateUserData)
.then((resolve)=>{
let apiResponse = response.generate(false, 'Group created', 200, resolve);
console.log(apiResponse);
})
.catch((err)=>{
let apiResponse = response.generate(true, 'Group not saved', 400, null);
console.log('group creation failed',err);
res.send(apiResponse);
})

updateUserData中,如何在从数据库获取数据时检查错误。因此它最终进入了承诺的捕获块。调用error的apiResponse

我不知道如何抛出相当于拒绝承诺的错误。

好吧,你应该throwit而不是returnit:-(async function中的异常将导致返回的promise被拒绝。

async function updateUserData(data) {
try {
for (user of data.contributorIds) {
const res = await UserModel.findOne({'userId':user});
res.groups.push(data.groupdata._id);
const resSave = await res.save();
let id = 'GroupCreated'+user;
eventEmitter.emit('getGroup', user);
}
return 1;
} catch(e){
throw e;
//      ^^^^^
}
}

然而,用try/catch捕获错误只是为了重新抛出它而不做任何其他事情是没有意义的,您应该让异常冒泡。简化为

async function updateUserData(data) {
for (user of data.contributorIds) {
const res = await UserModel.findOne({'userId':user});
res.groups.push(data.groupdata._id);
const resSave = await res.save();
let id = 'GroupCreated'+user;
eventEmitter.emit('getGroup', user);
}
return 1;
}

最新更新