如何重写异步函数(node.js,和尚)

用户名

我正在尝试编写一个异步函数,以便从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

和尚addToSet重写数组

Node.js,Express,Mongodb使用和尚数据库为空

如何从 node.js 中的异步函数返回值

如何为Node.js编写异步函数

如何在Node.js中显示异步函数的结果

如何从AWS Lambda node.js异步函数返回数据?

如何在Node.js中处理异步函数

Node.js-如何通过回调调用异步函数?

如何在Node.js中处理异步函数

如何在mongo和尚中使用$ in

如何使和尚findoneandupdate属性成为变量?

在异步函数Node.Js中调用的异步函数

即使等待位于 Node.js 中的异步函数中,如何修复“await 仅在异步函数中有效”?

如何在Node.js或Javascript中将异步函数调用包装到同步函数中?

在node.js中完成异步函数后如何运行函数?

在Node.js中循环异步函数

Node.js 异步函数并行执行?

如何使用 node.js 和 Azure 存储表在异步函数中使用 continuationKey

如何避免Node.js中异步函数的长时间嵌套

如何在 node.js 中使用 mysql 制作异步函数

如何测量Node.js中异步函数的执行时间?

如何使用和尚连接到多个MongoDB数据库?

从异步函数向外部函数Node js返回值

Node.JS函数返回异步回调函数的值

无法将Node.js异步函数识别为有效的异步函数

如何使用Node.js的“异步”模块在一个函数中执行“ A”或“ B”,然后始终执行“ C”?

如何将 net.socket 数据从 AWS Lambda Node.js 8.10 异步函数返回到 AWS API 网关?

链接异步函数Node.js bluebird mongoskin

在 JavaScript/node js 中的 for 循环中调用异步函数