gpt4 book ai didi

javascript - 如何重写异步函数(node.js、monk)

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:31 25 4
gpt4 key购买 nike

我正在尝试编写一个异步函数,从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com