0

私はこのような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

私はそれをデバッグするのに多くの時間を無駄にしましたが、解決方法がわからない小さな間違いをしていると思います。

4

1 に答える 1

2

ログを調整して、それぞれに一意のメッセージ (現在横にあるコメントなど) を含めると、おそらく特定の、おそらく予期しない順序で表示されます。

log2
log2
log3
log1
log1

発生している問題は範囲外です。タイミングの一つです。関数は、 のように即時または同期的にだけ_.each()でなく、「後で」またはのように非同期的にも、いつでも呼び出すことができますSolrClient.select()

続行する前にすべてのクエリが終了していることを確認するには、次のようにSolrClient.select()交換できます。_.eachasync.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);
    });
}
//...
于 2012-12-08T07:43:08.390 に答える