Node.js异步瀑布模块回调



我有我的节点.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的回调无法访问在_.each之前初始化的相同categoryData

浪费了很多时间来调试它,但我想我正在做一些小错误,我不知道如何解决。

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

log2
log2
log3
log1
log1

你遇到的问题不是范围问题,而是时机问题。函数可以随时调用 - 不仅像_.each()那样立即或同步调用,而且像SolrClient.select()一样"稍后"或异步调用

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

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

相关内容

  • 没有找到相关文章

最新更新