我正在尝试编写一个异步函数,从 mongodb 集合中为我提供一个随机文档。
var getRandDoc = function(){
var db = monk('localhost/data');
var coll = db.get('coll');
coll.count({}, function(err, count){
if (err) console.log(err);
else {
coll.find({}, {limit:-1, skip:randomNum(0, count)}, function(err, out){
if (err) console.log(err);
else{
db.close();
return out[0]['name'];
}
});
}
});
}
在另一个文件中,我使用以下内容调用此函数:
console.log(test.getRandDoc());
我得到未定义
我做错了什么以及如何解决它?
最佳答案
这是常见的 Node 回调困惑。如果您不想使用 Promise,则 getRandDoc() 需要接受回调,然后使用 coll.find(...) 方法中的结果调用它。所以像这样:
var getRandDoc = function(cb){
var db = monk('localhost/data');
var coll = db.get('coll');
coll.count({}, function(err, count){
if (err) console.log(err);
else {
coll.find({}, {limit:-1, skip:randomNum(0, count)}, function(err, out){
if (err) return cb(err)
else{
db.close();
return cb(null, out[0]['name']);
}
});
}
});
}
您可能也想传回该错误,因此:
test.getRandDoc(function(err, name){
});
基于 promise 的版本将如下所示:
var getRandDoc = function(){
var db = monk('localhost/data');
var coll = db.get('coll');
var deferred = Q.defer();
coll.count({}, function(err, count){
if (err) deferred.reject(err);
else {
coll.find({}, {limit:-1, skip:randomNum(0, count)}, function(err, out){
if (err) deferred.reject(err);
else{
db.close();
deferred.resolve((out[0]['name']);
}
});
}
});
return deferred.promise;
}
但它仍然不会为您提供直接的变量赋值。你最终会这样调用它:
test.getRandDoc().then(function(res){}).fail(function(err){});
欢迎来到 Node !
关于javascript - 如何重写异步函数(node.js、monk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713286/