2012-01-12 8 views
1

redisとノード(node_redis)を使用していますが、データをredyからXMLファイル(simple-xml-writerを使用)にシリアル化したいのですが、ノードの非同期動作が発生します。ノードで赤データをシリアライズ

私はa、b、c、d、eのデータセットをredisでハッシュとして格納しています。これらのキーはdata:a、data:b data:c ...であり、各キーはハッシュにアクセスします。今私のXMLファイルは次のようになります。

<root> 
    <data record="a"> 
    (data for a) 
    </data> 
    <data record="b"> 
    (data for b) 
    </data> 
    ... 
</root> 

私のアプローチは次のように何かをすることです:

myobjects = Array.new(); 
["a","b","c","d","e"].forEach(function(str) { 
    database.hmget("data:" + str,function(err,obj){ myobjects.push(obj) }); 
}); 
now_serialize_myobjects(); 

は、それは、すべてのオブジェクトを確認してくださいを終了するforEach -loopのを待つことは可能ですdatabase.hmget()に保存されていますか?したがって、関数now_serialize_myobjects()を呼び出すと、すべてのオブジェクトが対象となりますか?

この問題の最善のアプローチは何ですか?

答えて

2

最も簡単な方法

myobjects = Array.new(); 
var something = ["a","b","c","d","e"]; 
something.forEach(function(str) { 
    database.hmget("data:" + str,function(err,obj){ 
    myobjects.push(obj); 
    if(myobjects.length === something.length){ 
     now_serialize_myobjects(); 
    } 
}); 
}); 

しかし、なぜ要求が戻らとしてシリアライズしませんか?

startxmlfile(); 
var something = ["a","b","c","d","e"]; 
var completionCounter = 0; 
something.forEach(function(str) { 
    database.hmget("data:" + str,function(err,obj){ 
    completionCounter++; 
    if (!err) 
     serialize(obj); 
    if (completionCounter ===something.length) 
     finalizexmlfile(); 

}); 
}); 

あなたが二つあるもののトンをロードする場合は、より良い私は

+0

良いアイデアだと思います。私は現在#1を使用していますが、#2の利点が分かります。ありがとう! – topskip

関連する問題