javascript - 使用异步库组装数据库中的所有标签

标签 javascript node.js asynchronous collections sails.js

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

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

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

感谢您的帮助

最佳答案

只是想通过将 @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);
      }

关于javascript - 使用异步库组装数据库中的所有标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30145246/

相关文章:

javascript - 这个讨厌的按钮是双跳

node.js - Jest 测试通过但最后出现错误 : connect ECONNREFUSED 127. 0.0.1:80

Python:Tornado 和持久数据库连接

ASP.NET 后台线程

Javascript - 创建一个新的数组方法

javascript - 是否可以在 php 验证和重定向之后调用 html 中的 js?现在尝试用Ajax解决

javascript - React-Native FlatList 不使用自定义 renderItem 重新渲染

node.js - 如何在 Jade 中每三次迭代插入新的 tr

Node.js + Passport : What happens to 3rd argument 'info' in done() method?

javascript - 为什么cb异步运行时仍然定义了这个var?