Tôi thường sử dụng một mẫu như bên dưới cho loại vấn đề này. Tóm lại:lấy một danh sách những thứ sau đó gọi một hàm để xử lý danh sách đó; hàm đó tự gọi cho đến khi hoàn thành danh sách; thu thập các kết quả khi bạn đi trong bộ tích lũy; khi danh sách trống, hãy trả lại bất cứ thứ gì bạn đã tích lũy được thông qua lệnh gọi lại. Đó chỉ là một cách khác để hoàn thành những gì @Andrey Sidorov đã thể hiện trong phản hồi của mình.
//cb is (err, res)
function getData(cb){
var querystr = "SELECT * FROM groups";
var result = "";
dbClient.query(querystr, function (err, res, fields) {
if (err)
cb(err);
else {
var groups = [];
for (var ndx in res)
groups = groups.concat(res[ndx].members.split(","));
getMembers(groups, [], cb);
}
});
}
function getMembers(members, sofar, cb){
var member = members.shift();
if (!member)
cb(null, sofar);
else {
var memberquery;
var params;
if (member.substr(0,1) == "@") {
memberquery = "SELECT name FROM groups WHERE id = ?";
params = [member.substr(1, member.length-1)];
} else {
memberquery = "SELECT username FROM users WHERE id = ?";
params = [member];
}
dbClient.query(memberquery, params, function(err, res) {
if (err)
cb(err);
else {
var membername = "";
if (typeof res[0].username == "undefined") {
membername = "@" + res[0].name;
} else {
membername = res[0].username;
}
sofar.push(membername);
getMembers(members, sofar, cb);
}
});
}
}