如何在javascript中等待db的结果

时间:2014-01-03 12:22:48

标签: javascript node.js

我正在使用nodepg模块与Postgres对话。我试图抽象出一些函数,以便重用它们,但是node的非阻塞让我搞砸了。

我创建了2个函数,一个用于获取user

var getUser = function(id) {
  var query = client.query('SELECT * FROM USERS WHERE USER_ID=$1', [id]);
  query.on('row', function(row, result) {
    result.addRow(row);
  });
  query.on('end', function(result) {
    return result;
  });
}

然后另一个函数services附加到user

var getUserServices = function(id) {
  var query = client.query('SELECT * FROM SERVICES WHERE USER_ID = $1', [id]);
  query.on('row', function(row, result) {
    result.addRow(row);
  });
  query.on('end', function(result) {
    var services = _.map(result.rows, function(row) {
      return row.subservice_id;
    });
    return services;
  });
}

然后我用另一种方法调用这些函数:

var getCompleteUser = function(req, res) {
  var user = getUser(req.body.id);
  var subservices = getUserService(req.body.id);
  user.subservices = subservices;
};

但是当我尝试将服务附加到用户时,尚未创建用户。我确信这是一个完整的菜鸟问题,但我无法弄清楚这一点。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以选择以下任何选项。下一个功能set timeout或使用node-async成功执行操作。

答案 1 :(得分:0)

使用回调,Luke; - )

您可以重新定义您的功能:

var getUser = function(id, callback) {
  var query = client.query('SELECT * FROM USERS WHERE USER_ID=$1', [id]);
  query.on('row', function(row, result) {
    result.addRow(row);
  });
  query.on('end', function(result) {
    callback(result.get(0)); // This one's ugly, but oh well...
  });
}

然后,在您的代码中,像这样使用它:

var getCompleteUser = function(req, res) {
    getUserService(req.body.id, function(subservices) {
        getUser(req.body.id, function(user) {
            user.subservices = subservices;

            // Go on with your logic here
        }
    }
}