2012-01-12 47 views
1

我正在使用redis和节点(与node_redis),我想序列化来自redis的数据到一个XML文件(使用simple-xml-writer),但我偶然发现节点的异步行为。序列化REDIS数据与节点

我有一个数据集的a,b,c,d和e作为散列存储在redis中,键是数据: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 2012-01-13 10:37:42