मैं आमतौर पर इस प्रकार की समस्या के लिए नीचे दिए गए पैटर्न की तरह एक पैटर्न का उपयोग करता हूं। संक्षेप में:चीजों की एक सूची प्राप्त करें, फिर सूची को संभालने के लिए एक फ़ंक्शन को कॉल करें; सूची पूरी होने तक वह फ़ंक्शन स्वयं को कॉल करता है; जैसे ही आप संचायक में जाते हैं, परिणाम एकत्रित करें; जब सूची खाली हो, तो कॉलबैक के माध्यम से जो कुछ भी आपने जमा किया है उसे वापस कर दें। @Andrey Sidorov ने अपनी प्रतिक्रिया में जो दिखाया, उसे पूरा करने का यह एक और तरीका है।
//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);
}
});
}
}