2015-05-09 72 views
2

我正在使用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

CB()需要在if(foundTag){...} – Ben

+0

之後在Tag.findOneById()中調用,那神奇地解決了這個問題。在if(foundTag){}塊之後調用cb()的祕訣是什麼?非常感謝 – TonyGW

+1

,因爲Tag.findOneById()是異步的,所以當cb()在外面時,它會發信號通知eachSeries()繼續循環並獲取到retTagNames(),而不是等待所有迭代完成後才能到達retTagName() – Ben

回答

0

只是想從上面裝有@奔的回答在他的評論後這個正確答案,以便其他人可以很容易地找到我工作:

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