javascript - Nodejs 函数在内部函数完成之前返回

标签 javascript jquery node.js express

我试图返回 MongoDB 中是否已存在用户。在 collection.find() 中运行 console.log 会打印正确的金额(大于 0)。但是,当调用 userExists 时,它始终返回 false (0)。

如何让 Javascript 等待这些函数完成后再返回值?我读过有关 jQuery 的 $.Deffered() 的内容,但这对我来说感觉很脏,而且不起作用。

function userExists(db, uid){
    var collection = db.get('users');
    var ret = 0;

    collection.find({"uid":uid},{},function(e,docs){
        ret = docs.length
    });

    return ret > 0?true:false;
}

最佳答案

正如一些人所指出的,collection.find 是异步的,因此当您到达 userExists 中的下一行时(return ret 所在的行) > 0?true:false;),还为时过早,ret 的值尚未设置。在 collection.find 回调(以及它依次调用的任何函数)之外的任何地方,查询都还没有发生。

(基本上)没有办法在查询之后“暂停”userExists,因此您需要更改整个方法。您需要的是延续模式。这意味着无论您对collection.find的结果做什么都必须在回调中发生。

我不知道您想用 ret 做什么,因此这可能意味着您的代码组织方式将发生重大变化。以下是我希望能给您提供总体思路的概述:

function processResultAndDisplayToTheUser(ret) {
    //everything that needs to happen after the value of ret is set
    if (ret > 0) {
       doSomething();
    } else {
       doSomethingElse();
    }
}

function userExists(db, uid){
    var collection = db.get('users');

    //ret doesn't exist here

    collection.find({"uid":uid}, {}, function(e,docs){
        var ret = docs.length;

        //ret finally exists, so pass it to a function and use it
        processResultAndDisplayToTheUser(ret);
    });

    //ret doesn't exist here either
}

//ret still doesn't exist here

关于javascript - Nodejs 函数在内部函数完成之前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808590/

相关文章:

javascript - 如果从不执行,即使它是真的

javascript - 使用jquery淡出后隐藏div,而不是之前

javascript - 在 forEach 循环期间跳过第一次迭代

Javascript在创建子数组时使用原始数组

javascript - Reactjs - 正确设置内联样式

php - 我的网页没有运行我的 JavaScript 验证代码

javascript - 模糊事件和提交事件?

jquery - 预加载 ="none"不适用于 ie8

node.js - Node.js Stream 是否会计入您的虚拟主机流量带宽分配?

javascript - 通过 Express/Node.js 中的重定向将错误消息传递给模板