如何在异步函数中重新组织我的回报?



假设我有一个函数,我正在从数据库中获取一些数据。


findById(id) {
return Model.findById(id)
}

我需要像这样重新组织user data的回报:

{
name: "Tom",
age: 57
}

变成这样的东西:

{
message: "User is found successfully", 
success: true, 
user: user
}

到目前为止,我可以通过Promise "then"部分来管理它,如下所示:

return Model.findById(id)
.then(user => {
if (!user) {
logger.warn(`Coundn't find user with id: ${id}`);
return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
}
return { message: `User with id: ${id}`, success: true, user: user };
})
.catch(err => {
if (err) {
logger.error(err.message);
return { message: err.message, success: false, user: null };
}
})

我可以对async/await做同样的事情并退回我的重新申报表吗? 因为到目前为止,它从数据库返回user object

async findById(id) {
return await this.model.findById(id, function (user, err) {
if (err) {
console.log('test');
logger.error(err);
return { message: err.message, success: false, user: null };
}
if (!user) {
logger.warn(`Coundn't find user with id: ${id}`);
return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
}
return { message: `User with id: ${id}`, success: true, user: user };
});
}

提前感谢!

大多数数据库 API 不支持同时支持回调和承诺。 如果您传递回调,它们不会返回承诺。 选择一种样式或另一种样式。 您使用.then()的第一种方法效果很好,因为这都是基于承诺的。

第二种方法不起作用,因为您正在传递常规回调。 这告诉数据库不要返回承诺,因为您使用的是较旧的回调样式,但您正在尝试使用该承诺。

如果你想使用async/await,你可以这样做:

async findById(id) {
try {
let user = await this.model.findById(id);
if (user) {
return { message: `User with id: ${id}`, success: true, user: user };
} else {
logger.warn(`Coundn't find user with id: ${id}`);
return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
}
} catch(e) {
logger.error(err);
return { message: err.message, success: false, user: null };
}
}

仅供参考,您可以从第一个代码块中删除.catch()处理程序中的if (err)测试。 如果触发.catch(),则会出现错误 - 您无需测试是否存在错误。

最新更新