Что в основном означает «вызвать hgetall для каждого элемента в« reply », затем объединить все результаты и передать обратный вызов».

нилище данных redis у меня есть список ключей, я хочу перебрать этот список ключей и получить эти значения из redis. Уловка в том, что я использую управляемый событиями язык, javascript через node.js

Если бы JavaScript был процедурным, я мог бы сделать это

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

Но я не могу, поэтому ... Я делаю это?

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

Это неправильно, потому что вместо того, чтобы выполнять все запросы сразу, а затем позволять обратным вызовам вставлять в список, я форсирую последовательную последовательность вызовов. Что произойдет, если есть 1000 ключей?

Могу ли я сделать это как-нибудь?

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

Ответы на вопрос(0)

Ваш ответ на вопрос