2012-01-12 15 views
1

J'utilise redis et node (avec node_redis) et je voudrais sérialiser les données de redis dans un fichier XML (en utilisant simple-xml-writer), mais je tombe sur le comportement asynchrone du noeud.Sérialiser les données redis avec le noeud

J'ai des ensembles de données pour a, b, c, d et e stockés comme un hachage dans redis, les clés sont des données: a, données: b données: c ... et chaque clé accède à un hachage. Maintenant, mon fichier XML devrait ressembler à ceci:

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

Mon approche est de faire quelque chose comme:

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

Est-il possible d'attendre le forEach -loop pour terminer et être que tous les objets dans database.hmget() sont stockés? Donc, lorsque vous appelez la fonction now_serialize_myobjects(), tous les objets sont couverts?

Quelle est la meilleure approche pour ce problème?

Répondre

2

approche la plus simple

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(); 
    } 
}); 
}); 

Mais pourquoi ne pas sérialiser les demandes de retour?

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(); 

}); 
}); 

si vous chargez une tonne de trucs seconde est mieux je pense

+0

Bonne idée. J'utilise maintenant # 1, mais je vois l'avantage de # 2. Merci! – topskip

Questions connexes