node.js异步瀑布模块回调

时间:2012-12-08 03:47:40

标签: node.js asynchronous callback waterfall

我有像这样的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

我知道这与变量范围OR有关 SolrClient的回调无法访问categoryData之前初始化的_.each

我浪费了很多时间调试它,但我想我正在做一些小错误,我没有得到如何解决。

1 个答案:

答案 0 :(得分:2)

如果您调整日志以包含每个日志的唯一消息(例如当前旁边的评论),它们可能会以特定的,可能是意外的顺序出现:

log2
log2
log3
log1
log1

您遇到的问题不属于范围;这是时机之一。可以随时调用函数 - 不仅可以立即调用同步,还可以调用“以后”或异步_.each()一样。

要确保所有SolrClient.select()的查询在继续之前完成,您可以将SolrClient.select()替换为async.forEach

_.each