我正在尝试编写一个异步函数,以便从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());
我得到 undefined
我在做什么错,我该如何解决?
这是通常的节点回调混乱。如果您不想使用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){});
欢迎来到节点!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句