使用异步库 assemble 来自数据库的所有标签
Using async library to assemble all tags from database
我正在使用 sails.js 创建一个标签系统,它与名为 Post
的实体具有多对多关系。我进行关联的方式是使用数据库 table 将每个 tagId
与 postId
相关联。每个 Post 可以有多个标签。
检索 {tagId : 'tagId, postId: 'postId'}
个对象的数组后,我需要检索每个 tagId
的标签名称。我正在使用 async
库,但是标签名称数组 (String) return 是一个空的,从日志信息中,我可以看到 return 发生在完成之前迭代器函数。我的代码如下:
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()
可能是我需要 assemble 给定 postId
的所有标签。或者我使用 async.eachSeries()
的方式不对?
感谢您的帮助
只是想 post 通过将 @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);
}
我正在使用 sails.js 创建一个标签系统,它与名为 Post
的实体具有多对多关系。我进行关联的方式是使用数据库 table 将每个 tagId
与 postId
相关联。每个 Post 可以有多个标签。
检索 {tagId : 'tagId, postId: 'postId'}
个对象的数组后,我需要检索每个 tagId
的标签名称。我正在使用 async
库,但是标签名称数组 (String) return 是一个空的,从日志信息中,我可以看到 return 发生在完成之前迭代器函数。我的代码如下:
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()
可能是我需要 assemble 给定 postId
的所有标签。或者我使用 async.eachSeries()
的方式不对?
感谢您的帮助
只是想 post 通过将 @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);
}