Javascript node.js:异步回调值

Javascript node.js:异步回调值,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我很困惑。我很想了解如何将在异步函数中获得的值传递到 我有一个具有基本auth函数的模块。在登录中,我要求用户模型搜索具有给定用户名的用户 login: function(req){ var username = req.body.username, password = req.body.password; user.find(username); } 然后用户模型继续这样做 exports.find = function(username){ consol

我很困惑。我很想了解如何将在异步函数中获得的值传递到

我有一个具有基本auth函数的模块。在登录中,我要求用户模型搜索具有给定用户名的用户

login: function(req){
    var username = req.body.username,
        password = req.body.password;

    user.find(username);
}
然后用户模型继续这样做

exports.find = function(username){
console.log(User.find({username: username}, function(error, users){
    // I get nice results here. But how can I pass them back.
}));
}

但是如何将该用户对象传递回登录函数?

您不能将其传递回(因为函数os asynchronous和
login
在完成时已经返回)。但是您可以将它提前传递给另一个函数。

您需要将回调函数传递给该方法。js需要一种非常回调驱动的编程风格

例如:

// in your module
exports.find = function(username, callback){
    User.find({username: username}, function(error, users){
        callback(error, users);
    });
}

// elsewhere... assume you've required the module above as module
module.find(req.params.username, function(err, username) {
    console.log(username);
});
所以您不返回值;传入函数,然后接收值(冲洗,重复)

用户类上的登录方法将如下所示:

login: function(req, callback){
    var username = req.body.username,
        password = req.body.password;

    user.find(username, function(err, user) {
        // do something to check the password and log the user in
        var success = true; // just as an example to demonstrate the next line
        callback(success); // the request continues
    };
}

您的示例代码令人困惑。我认为您缺少的是
exports.find
函数中的回调函数。但是如果你从登录函数调用它,你会创建无限递归。。。也许你在你的问题中混淆了这一点?在与这个简单的问题争论了这么久之后,我感到困惑。答案是肯定的。虽然大部分答案都在正确的轨道上,但与“程序性”的比较并不相关。同步/异步的区别与代码是过程型、函数型还是其他类型无关;我把它改成了回调驱动。在我的辩护中,现在是悉尼的凌晨5点:)我想指出一点,你必须以不同的方式思考,使用回调而不是返回值。好的,我们就让这一次过去。如果是早上6点,那么…:-)将回调传递给user.find()就是解决方案。如此简单,却又如此重要。非常感谢。好教训。