【问题标题】:Asycn problems with node and mongoose节点和猫鼬的异步问题
【发布时间】:2014-11-19 10:11:38
【问题描述】:

所以我对节点完全陌生,我正在尝试为一个班级完成一个简单的网络应用程序。 本质上,我有一些代码想要将用户添加到数据库,并且取决于添加到数据库是否成功或密码是否错误或用户名是否超过 128 个字符,然后我想返回一个值。所以在我的例子中,老兄正在充当那个价值。我想返回花花公子 = 100 或我设置的任何值,但花花公子继续为 0。我该如何进行“等待”,以便花花公子可以是 100,而不涉及 settimeout。谢谢!

    exports.add= function (user, password) { 
    var dude = 0;
    User.findOne({'local.user' : user, function(err, current_user) {
     dude = 100;
    });
    return dude;
    }

【问题讨论】:

    标签: node.js asynchronous mongoose


    【解决方案1】:

    对于异步编程的新用户来说,这是一个很常见的问题。您要做的是从同步函数返回一个值,该值取决于异步函数的结果。在这种情况下,return dude 实际上是在您设置 dude = 100; 之前调用的。您需要接受对该添加函数的回调,一旦添加完成就可以调用该回调。类似于以下内容:

    exports.add = function (user, password, done) { 
      User.findOne({'local.user' : user, function(err, current_user) {
       done(err, 100); //  pass the err and code to the callback
      });
    }
    

    更新

    缩小一点,这就是您使用新模块的方式。

    var User = require('./user'); // load the module defined above.
    
    User.add(user, password, function(err, code) {
      if(err || code === 123) {
        // Do something here.
      }
    });
    

    这定义了一个内联函数,当 User.add 完成添加用户时调用该函数。再缩小一点(假设是 Express)看起来像:

    var User = require('./user'); // load the module defined above.
    
    app.post('/user/', function(req, res) {
      var user = buildUserFromReq(req);
      var password = req.body.password;
    
      User.add(user, password, function(err, code) {
        if(err) {
          return res.send('cannot add user', err);
        }
    
        res.send('user added');
      });
    
    });
    

    【讨论】:

    • 对不起,这是一个很好的答案,但我无法理解这个问题!所以我会用我想要返回的特定值来调用 done ,但是在哪里定义了 done ?您还说一旦添加完成就调用完成,但我不确定该调用是在哪里进行的,再次非常感谢!
    • 我在答案中添加了一些示例,向您展示了如何将 add 函数与回调一起使用。
    • 哇,非常感谢!!很多人说'哦,只使用回调',但我不知道它们是什么,甚至阅读它们只是让我更加困惑,但这真的澄清了很多!再次感谢!
    猜你喜欢
    • 2020-10-16
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2021-04-20
    • 2020-02-29
    • 2018-08-30
    相关资源
    最近更新 更多