如何让Nodejs调用同步然后我可以轻松使用它?

时间:2012-05-31 20:19:57

标签: javascript node.js asynchronous

app.post('/login', function (req, res) {

    var login = req.body.login;
    var pass = req.body.pass;

    var ret = CheckUserValid(login, pass);

  res.send(ret);
})

function CheckUserValid(login, pass,callback) {
    var sql = "SELECT * FROM `user` WHERE login = ? AND pass= ?";
    client.query(sql, [login, pass], function selectResutl(err, results, fields) {
         console.log(results);
        if (!err) return true;
        else
            throw err;
    });
}

第一个函数是关于请求,第二个是关于调用mysql。因为它是异步的所以它不起作用。 有人可以让我知道如何让它像C#一样同步工作。

3 个答案:

答案 0 :(得分:4)

CheckUserValid方法的签名已经隐含callback。 您可以使用它在db-request完成时调用某些内容,如下所示:

app.post('/login', function (req, res) {
  var login = req.body.login;
  var pass  = req.body.pass;

  // use a closure here for the callback of checkUserValid
  checkUserValid(login, pass, function(err, isValid) {
    // send the response when checkUserValid is done
    res.send(isValid)
  });
})

function checkUserValid(login, pass, callback) {
  var sql = "SELECT * FROM `user` WHERE login = ? AND pass= ?";
  client.query(sql, [login, pass], function(err, results, fields) {
    console.log(results);
    if (!err) {
      // there is no error, pass null for the error
      // and true for the result
      callback(null, true);
    } else {
      // an error occurred in the db-query
      // pass it to the callback
      callback(err)
    }
  });
}

按照惯例,您应该将err作为第一个参数传递,但最终由您决定。 但是,您可以将原始错误传递给初始函数并在那里处理。

答案 1 :(得分:3)

您应该查看Fibers模块。

答案 2 :(得分:1)

您可以按顺序链接要调用的函数

e.g。您可以res.send(ret);作为CheckUserValid

的回调