我最初用promises编写了代码,但是由于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 中,如何在从数据库中获取数据时检查错误。 以便最终到达承诺的陷阱。并调用错误的 apiResponse 。
答案 0 :(得分:2)
我不知道如何抛出与拒绝诺言等效的错误。
好吧,您应该throw
而不是return
它:-) async function
中的异常将导致返回的承诺被拒绝。
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;
}