我正在使用node
与pg
模块与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;
};
但是当我尝试将服务附加到用户时,尚未创建用户。我确信这是一个完整的菜鸟问题,但我无法弄清楚这一点。我该怎么办?
答案 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
}
}
}