使用异步库汇编数据库中的所有标记

时间:2015-05-09 21:33:19

标签: javascript node.js asynchronous collections sails.js

我正在使用sails.js创建一个与名为Post的实体具有多对多关系的标记系统。我进行关联的方式是使用数据库表将每个tagIdpostId相关联。每个帖子都有多个标签。

在检索{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()的方式是错误的?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

只是想通过在上面的评论中加入@Ben的答案来发布这个正确答案,以便其他人可以轻松找到对我有用的内容:

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);
      }