如何将此函数转换为使用then和catch进行链接?
链接更好吗?
我的意思是User.findOne().then().catch()
User.findOne({_id: msg.chat.id}, (err, doc) => {
if (err) {
console.log(err);
}
if (doc) {
console.log(doc.name);
} else {
console.log('Empty');
}
});
答案 0 :(得分:3)
如果操作成功,则使用返回的文档调用传递给then
的函数(或为null),如果操作失败(例如,没有连接),则调用catch
并返回错误。把它放在一起看起来像这样:
User.findOne({_id: msg.chat.id})
.then(doc => {
if (doc) {
console.log(doc.name);
} else {
console.log('Empty');
}
}).catch(err => {
if (err) {
console.log(err);
}
});
顺便说一句,当您按ID搜索一个文档时,您可以使用findById
:
User.findById(msg.chat.id)
.then(doc => {
if (doc) {
console.log(doc.name);
} else {
console.log('Empty');
}
}).catch(err => {
if (err) {
console.log(err);
}
});
答案 1 :(得分:1)
最好切换到ES2017 async/await
语法,你可以避免承诺地狱
async function foo () {
try {
var doc = await User.findOne({_id: msg.chat.id}).exec()
if (doc)
return console.log(doc.name);
console.log('Empty');
} catch (err) { console.log(err) }
}
foo()
当您进行DB
来电或使用for...loops
时,这会对您有所帮助。
async function foo () {
try {
var users = await User.find({}).exec()
for (var user in users) {
var tweets = await Tweet.find({_user: user._id}).exec()
user.tweets = tweets.map(t => t.text)
await user.save()
}
} catch (err) { console.log(err) }
}
foo()