In einem Redis-Datenspeicher habe ich eine Liste von Schlüsseln, ich möchte über diese Liste von Schlüsseln iterieren und diese Werte von Redis erhalten. Der Haken ist, dass ich eine ereignisgesteuerte Sprache verwende, nämlich Javascript über node.js
Wenn javascript prozedural wäre, könnte ich dies tun
function getAll(callback) {
var list = redis.lrange(lrange('mykey', 0, -1);
for ( var i = 0; i < list.length; i+= 1 ) {
list[i] = redis.hgetall(list[i]);
}
callback(list);
}
Aber ich kann deshalb nicht ich dies tun?
function getAll(callback) {
redis.lrange('mykey', 0, -1, function(err, reply) {
// convert reply into messages
var list = [];
var index = -1;
var recurse = function() {
if ( index == reply.length ) {
callback(list);
} else {
redis.hgetall(reply[i], function(err, reply) {
list.push(reply);
index += 1;
recurse();
});
}
};
recurse()
});
};
Das scheint falsch zu sein, denn anstatt alle Anfragen auf einmal auszuführen und dann Rückrufe in die Liste einfügen zu lassen, erzwinge ich eine sequentielle Aufrufsequenz. Was passiert, wenn es 1000e von Schlüsseln gibt?
Kann ich das irgendwie machen?
function getAll(callback) {
redis.lrange('mykey', 0, -1, function(err, reply) {
// convert reply into messages
var list = [];
var insert = function(err, reply) {
list.push(reply);
};
for ( var i = 0; i < reply.length; i += 1 ) {
redis.hgetall(reply[i], insert);
}
??? how to block until finished ???
callback(list);
});
};