2012-12-08 67 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