我在使用 node.js 时遇到问题。所有人都试图在代码注释中进行描述。
我需要构建一个对话框数组,其中包含有关对话者和最后一个 meggase 的一些信息。
IM = {
iUserId: false,
socket: false,
checkDialog: function(socket) {
this.socket = socket;
// Returned [{owner: 123, viewer: 432}]
var sql = 'SELECT DISTINCT(`owner_user_id`), `viewer_user_id` FROM `phpfox_mail` WHERE `owner_user_id` = ' + this.iUserId + ' GROUP BY 1,2 UNION SELECT DISTINCT (`viewer_user_id`), `owner_user_id` FROM `phpfox_mail` WHERE `viewer_user_id` = ' + this.iUserId + ' GROUP BY 1,2 ORDER BY 1 ';
connection.query(sql, function(err, rows) {
if (err) throw err;
async.map(rows, function(item, nextParent) {
var sql = 'SELECT `mail_id`, `subject`, `preview`, `owner_user_id`, `viewer_user_id`, `viewer_is_new`, `time_stamp` FROM `phpfox_mail` WHERE (`viewer_user_id` = ' + item.viewer_user_id + ' OR `owner_user_id` = ' + item.viewer_user_id + ') AND (`viewer_user_id` = ' + item.owner_user_id + ' OR `owner_user_id` = ' + item.owner_user_id + ') ORDER BY `mail_id` DESC LIMIT 1';
var dialogs = [];
connection.query(sql, function(err, rows) {
// ???
});
}, function(err, item) {
// Here I have to get the generated array with all the necessary dialogue.
console.log(item);
IM.socket.emit('logger', {text: 'dataIsABuilding', key: 'success'});
IM.socket.emit('dialogsBuilding', item);
});
});
}
};
目标:创建有关消息和对话者的一系列信息。
方案:
- 获取包含所有对话者的数组。 [{owner_user_id: 5757、viewer_user_id: 5866}、{etc...}]
- 使用第 1 段的结果,从对话中获取有关最新报告的一系列信息。 [{mail_id: 98,主题:test,所有者:5757,查看者:5866,时间戳:123566544},{etc...}]
- 获取有关指定标识符 (owner_user_id/viewer_user_id) 的用户的信息。
- 将对话的所有数据收集到同一数组中。
我停在第三段了。也就是说,我不知道如何一致地获取前两个数组中的用户信息。
请帮助我!
最佳答案
我不相信您正确使用 async.map 函数。不幸的是,您使用它的方式如此错误,以至于我无法确定您实际上想要做什么。但这里解释了您如何滥用 async.map 函数以及正确使用 async.map 函数。
异步文档中的示例:
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
让我们稍微简化一下。
async.map(someArray, someFunction, someCallBack);
我相信你的问题在于 someFunction 参数。这是您的版本:
function(item, nextParent) {
var sql = 'SELECT `mail_id`, `subject`, `preview`, `owner_user_id`, `viewer_user_id`, `viewer_is_new`, `time_stamp` FROM `phpfox_mail` WHERE (`viewer_user_id` = ' + item.viewer_user_id + ' OR `owner_user_id` = ' + item.viewer_user_id + ') AND (`viewer_user_id` = ' + item.owner_user_id + ' OR `owner_user_id` = ' + item.owner_user_id + ') ORDER BY `mail_id` DESC LIMIT 1';
var dialogs = [];
connection.query(sql, function(err, rows) {
// ???
});
}
如果我们查阅 fs.Stat 示例,该参数的函数应该采用两个参数,第一个参数是我们发送到 async.map 的数组中的一个项目。这部分我相信你是对的。然而,第二个参数是一个回调,有两个参数。一个错误和一组结果。这是我认为你搞砸的部分。您应该调用此回调。 async.map 内部提供了回调参数,该回调参数是 async.map 将结果收集到数组中的方式。如果不调用此方法,async.map 将无法收集结果。
我相信你想要的是这样的:
function(item, someCallBackArgument) {
var sql = 'SELECT `mail_id`, `subject`, `preview`, `owner_user_id`, `viewer_user_id`, `viewer_is_new`, `time_stamp` FROM `phpfox_mail` WHERE (`viewer_user_id` = ' + item.viewer_user_id + ' OR `owner_user_id` = ' + item.viewer_user_id + ') AND (`viewer_user_id` = ' + item.owner_user_id + ' OR `owner_user_id` = ' + item.owner_user_id + ') ORDER BY `mail_id` DESC LIMIT 1';
var dialogs = [];
connection.query(sql, function(err, rows) {
someCallBackArgument(err, rows);
});
}
关于javascript - 数据库查询中的异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677867/