【发布时间】:2019-01-15 15:53:46
【问题描述】:
我在异步代码方面没有太多经验,我遇到了一个问题,这是我的代码:
if (!req.params.user_name) {
req.params.user = req.me;
} else {
User.findOne({username: req.params.user_name}, '_id', (error, user) => {
if (error) {
return next(error);
}
if (!user) {
let error = new Error('User not found');
return next(error);
}
req.params.user = user;
});
}
Account.findOne({name: req.params.account_name, created_by: req.params.user})
.populate(['currency', 'created_by'])
.exec((err, account) => {
if (err) {
return next(err);
}
return res.send(account);
});
如您所见,问题在于,在一种情况下,我只需要做一个简单的程序操作,在另一种情况下,我必须查询异步数据库,然后我必须执行下面的代码。我不能简单地将 Account 查询放在 User 查询的回调中,因为我不需要一直执行 User 查询。 我试图在这里找到答案,但我发现的唯一结果是关于执行一个或另一个异步任务(例如:Working with promises inside an if/else)。 按照这篇文章的建议,我考虑将代码包装在匿名函数中的 if 块中,并执行以下操作:
let get_user;
if (!req.params.user_name) {
let get_user = () => {req.params.user = req.me};
} else {
let get_user = User.findOne({username: req.params.user_name}, '_id', (error, user) => {
if (error) {
return next(error);
}
if (!user) {
let error = new Error('User not found');
return next(error);
}
req.params.user = user;
});
}
get_user().then(() => {
Account.findOne({name: req.params.account_name, created_by: req.params.user})
.populate(['currency', 'created_by'])
.exec((err, account) => {
if (err) {
return next(err);
}
return res.send(account);
});
});
但我觉得这很奇怪,我想我需要从 if 块中的匿名函数返回一个 Promise。
那么解决这个问题的优雅方法是什么?我在空闲时间学习 node.js,任何一般性建议将不胜感激。
感谢您的宝贵时间。
【问题讨论】:
标签: node.js express asynchronous