2012-12-08 132 views
0

我有我的Node.js這樣的代碼Node.js的異步瀑布模塊回調

async.waterfall([ 
    function(callback){ 
     category = [{"id":1,"name":xxx},{"id":2,"name":yyy}]; 
     callback(null,category); 
    }, 
    function(category,callback){ 
     var categoryData ={}; 
     _.each(category,function(item){ 
      categoryData[item.id] = item;   
      SolrClient.select(query,function(data){ 
       //data is the response from SolrClient 
       categoryData[item.id]["data"] = data; 
       log(categoryData); //log1 
      },callback); 
      log(categoryData); //log2 
     }); 
     log(categoryData); //log3 
    } 
]); 

log1 => the data that I have added to categoryData is logged correctly 
log2 => I cant get the data that is logged in the callback function to SolrClient 
log3 => same as log2 

我明白,這事做可變範圍或 回調至SolrClient不能訪問相同的categoryData初始化之前_.each

我浪費了很多時間調試它,但我想我正在做一些小錯誤,我沒有得到如何解決。

+0

真正能夠幫助你是正確的縮進。 –

回答

2

如果你調整你的日誌,包括每一個獨特的信息(如評論目前他們旁邊),他們很可能會出現在一個特定的,也許意想不到的,順序爲:

log2 
log2 
log3 
log1 
log1 

問題你體驗不是範圍之一;這是時機之一。函數可以被稱爲在任何時候 - 不僅立即或同步與​​,也是「」或異步SolrClient.select()

爲了保證所有在繼續之前與SolrClient.select()完成查詢的,可以爲async.forEach換出_.each

//... 
function(category, waterfallCallback) { 
    var categoryData = {}; 

    async.forEach(category, function (item, forEachCallback) { 
     categoryData[item.id] = item; 

     SolrClient.select(query, function (data) { 
      categoryData[item.id]["data"] = data; 
      forEachCallback(null); 
     }); 
    }, function (err) { 
     waterfallCallback(null, categoryData); 
    }); 
} 
//... 
+0

謝謝你somuch jonathan ....我會在星期一嘗試... – user1244197