2016-03-08 98 views
2

我只是新進入節點,並結束新到async.js。我不確定我想做的事情是可行的(猜測是),或者我的做法是正確的(猜測它不是)。這裏是:node.js嵌套async.eachSeries

這段代碼是爲了管理一些instagram數據,所以我會根據代碼實際需要做些什麼來解釋一切,以便更容易理解。

  1. 連接到MongoDB中,得到一些的Instagram賬戶的ID(完成)

  2. 每個ID我想要得到的拉斯10個(我已經有一個保存在我的數據庫)。

  3. 對於每個帳戶的10個項目,我需要獲得(評論+喜歡)的總和並將該值與第一個eachSeries調用的out代碼相比較。

    router.get('/users_all', function(req, res) { 
    
        User.find().sort({'counts.followed_by': 'descending'}).exec(function(err, users) { 
    
         async.eachSeries(users, function(item, outerCallback) { 
    
          Media.find({'userId': item.user_id}).exec(function(err, medias) {  
    
           var count = 0; 
    
           async.eachSeries(medias, function(item, outerCallback2) {    
    
            count += item.comments_count + item.likes_count;    
           });  
    
          }); 
    
          item.totalAmount = count; 
    
         }); 
    
         res.json(users); 
    
        }); 
    
    } 
    

我剛纔沒有設置回調召喚出每個eachSeries的怎麼一回事,因爲我不知道往哪裏放他們,我想我的代碼更容易理解這種方式。

如果需要更多關於代碼請求的澄清。 感謝您的幫助。

回答

1

所以你主要在那裏(至少有回調)。

如果您在https://github.com/caolan/async上查看異步文檔,您會看到eachSeries的呼叫也有回調,因此一旦完成系列,您可以執行一些操作。

看起來你的代碼試圖完成一旦內部系列完成添加所有的值計數。所以你的async.eachSeries調用最終會看起來像這樣(加上一些額外的錯誤處理,我肯定會推薦你的mongo查詢)。

router.get('/users_all', function(req, res) { 
    User.find().sort({'counts.followed_by': 'descending'}).exec(function(err, users) { 
     if (err) { 
      res.status(500).json({code: 500, message: 'Internal server error'}); 
     } else { 
      async.eachSeries(users, function (item, outerCallback) { 
       Media.find({'userId': item.user_id}).exec(function (err, medias) { 
        if (err) { 
         outerCallback(err); 
        } else { 
         var count = 0; 
         async.eachSeries(medias, function (item, innerCallback) { 
          count += item.comments_count + item.likes_count; 
          innerCallback(); 
         }, function() { 
          if (err) { 
           outerCallback(err); 
          } else { 
           item.totalAmount = count; 
           outerCallback(); 
          } 
         }); 
        } 
       }); 
      }, function() { 
       res.json(users); 
      }); 
     } 
    }); 
}); 

問題是,它並不像你實際上是限制自己只是在最近10個項目,除非那是你已經保存在數據庫中的所有。

+0

你是對的,我簡單的代碼不要錯過10從媒體模型的結果,但我只是取代了我的代碼中的Media.find。它工作完美,感謝您的幫助。不得不要求從這裏學到一些東西:你基本上使用回調來「以某種方式」結束eachSeries循環的每次迭代,並在添加到eachSeries方法的函數中得到結果?這很簡單嗎?謝謝 –

+0

不是超級經驗豐富,可能會說一些錯誤,但我的理解基本上不是返回來結束函數說你已完成處理,而是讓eachSeries函數知道通過該回調完成了迭代。然後,一旦完成,您可以定義自己的回調,一旦數組中的每個回調完成,就會調用回調。所以!那簡單!你也可以在你的回調中包含錯誤主體,異步處理這些有點不同。 –