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

标签 javascript node.js asynchronous

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

相关文章:

java - CompletableFuture runAsync内部的单元测试代码

javascript - 如何使用 HTML5 <video> 标签播放 CENC 加密的 MP4 视频?

javascript - D3.js 可以使用 "whitespace"分隔值获取数据吗?

c# - 是否有可能有一个 .net Remoting 组件,其中每一端都使用不同版本的框架?

Angular2 - 无法读取嵌套调用中未定义的属性 'subscribe'

node.js - 您是否建议对 Azure 应用服务上托管的应用程序使用 Bunyan 或 Morgan 等记录器

javascript - 剑道模板发送数据

javascript - 首先在下拉菜单中选择jquery

node.js - 弹性对象内部的Elasticsearch搜索数组

node.js -/lib64/libc.so.6 : version `GLIBC_2.14' not found. 为什么会出现此错误?