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, ich bin mit einer ereignisgesteuerte Sprache, javascript über node.jsfür Schleife über ereignisgesteuertem Code?
wenn Javascript Verfahren waren konnte ich dies tue
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 nicht, dafür .. ich das 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()
});
};
Diese Nähte falsch, weil, anstatt alle Anfragen auf einmal ausführen, und dann lassen Rückrufe auf die Liste einzufügen, ich bin eine sequentielle Aufrufsequenz zu erzwingen. Was passiert, wenn es 1000 Schlüssel gibt?
Könnte ich das wie?
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);
});
};
Beide Antworten sind großartig, der Barrier Gist hat den Trick für mich gemacht – Daniel