2
我正在使用sails.js創建一個標記系統,該系統與名爲Post
的實體具有多對多關係。我進行關聯的方式是使用數據庫表將每個tagId
與postId
關聯起來。每個帖子可以有多個標籤。使用異步庫彙編數據庫中的所有標記
當我檢索到一個{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()
是錯誤的?
感謝您的幫助
CB()需要在if(foundTag){...} – Ben
之後在Tag.findOneById()中調用,那神奇地解決了這個問題。在if(foundTag){}塊之後調用cb()的祕訣是什麼?非常感謝 – TonyGW
,因爲Tag.findOneById()是異步的,所以當cb()在外面時,它會發信號通知eachSeries()繼續循環並獲取到retTagNames(),而不是等待所有迭代完成後才能到達retTagName() – Ben