para loop sobre código orientado a eventos?

Em um armazenamento de dados redis, tenho um li, st de chaves, quero iterar sobre essa lista de chaves e obter esses valores de redis. O problema é que estou usando uma linguagem orientada a eventos, javascript via node.js

Se o javascript fosse processual, eu poderia fazer isso

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

Mas não posso, por isso .. faço isso?

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

Isso parece errado, porque, em vez de executar todas as solicitações de uma só vez e permitir que os retornos de chamada sejam inseridos na lista, estou forçando uma sequência de chamadas seqüenciais. O que acontece se houver milhares de chaves?

Eu poderia fazer isso de alguma forma?

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

questionAnswers(3)

yourAnswerToTheQuestion