2012-01-12 1 views
1

Я использую redis и node (с 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