使用asynchronous库来组装来自数据库的所有标签

我正在使用sails.js创build一个标记系统,它与一个名为Post的实体具有多对多的关系。 我做关联的方式是使用数据库表来关联每个tagIdpostId 。 每个post可以有多个标签。

在检索{tagId : 'tagId, postId: 'postId'}对象的数组后,我需要检索每个tagId的标签名称。 我使用async库,但标记名称(string)数组返回一个空的,从日志信息,我可以看到,返回发生在迭代器函数完成之前。 我的代码如下:

 var tagIdPostIds = [ {tagId : 'abcx', postId: 1}, {tagId : 'abce', postId: 1}, {tagId : 'abcd', postId: 1}, ]; if (tagIdPostIds) { var tagsArr = []; //container of tag names var findTagById = function(tagIdPostIdObj, cb) { var tagId = tagIdPostIdObj.tagId; Tag.findOneById(tagId, function (err, foundTag) { if (err) return sendErrorMsgCode(res, "error in retrieving a tag", 401); if (foundTag) { sails.log.info('pushing in tag: ' + foundTag.tagName); tagsArr.push(foundTag.tagName); } }); cb(); //without this, the program just hangs, but why?? }; //findTagById var retTagNames = function(err) { if (err) return sendErrorMsgCode(res, "error in assembling tag names", 401); sails.log.info('returning tagsArr: ' + JSON.stringify(tagsArr)); return res.json(tagsArr); }; //retTagNames async.eachSeries(tagIdPostIds, findTagById, retTagNames); } 

在阅读async的文档后,我认为async.map()可能是我需要为给定的postId组装所有标签。 或者我的方式使用async.eachSeries()是错误的?

谢谢你的帮助

只是想通过在上面的评论中join@ Ben的回答来发布这个正确答案,所以其他人可以很容易地find对我有用的东西:

 var tagIdPostIds = [ {tagId : 'abcx', postId: 1}, {tagId : 'abce', postId: 1}, {tagId : 'abcd', postId: 1}, ]; if (tagIdPostIds) { var tagsArr = []; //container of tag names var findTagById = function(tagIdPostIdObj, cb) { var tagId = tagIdPostIdObj.tagId; Tag.findOneById(tagId, function (err, foundTag) { if (err) return sendErrorMsgCode(res, "error in retrieving a tag", 401); if (foundTag) { sails.log.info('pushing in tag: ' + foundTag.tagName); tagsArr.push(foundTag.tagName); } cb(); //this must be placed inside an async call to make it work! }); }; //findTagById var retTagNames = function(err) { if (err) return sendErrorMsgCode(res, "error in assembling tag names", 401); sails.log.info('returning tagsArr: ' + JSON.stringify(tagsArr)); return res.json(tagsArr); }; //retTagNames async.eachSeries(tagIdPostIds, findTagById, retTagNames); }