2013-05-16 5 views
1

У меня есть часть более крупного хэш набор с той же конвенции:Получение списка ключей от redis?

redis.hmset("this:that:a", {"one": 'two', "three": 'four'}); 
redis.hmset("this:that:b", {"five": "six", "seven": "eight"}); 

var all_parts = {}; 

redis.keys("this:that:*", function(err, keys) { 
    for (var i=0; i<keys.length; i++){ 
    key = keys[i]; 

    redis.hgetall(key, function(err, obj) { 

     all_parts[key] = obj; 

     if (i >= keys.length) { 
     return console.log(all_parts); 
     } else { 
     return console.log('waiting'); 
     } 

    }); 
    }; 
}); 

результат в console.log из ...

{ 'this:that:a': { five: 'six', seven: 'eight' } } 
{ 'this:that:a': { one: 'two', three: 'four' } } 

Я не понимаю, что происходит, любая помощь оценивается.

ответ

3

Во-первых, предварительный комментарий: вы не должны использовать команду KEYS в пользовательском приложении. Это команда отладки O (n). Если у вас много ключей в Redis, это заморозит экземпляр при каждом вызове.

Теперь, касаясь самой программы, вам необходимо проверить правила определения области действия Javascript (те, которые применяются к закрытию). Здесь вы получаете доступ к ключевой переменной в обратном вызове hgetall, но она не была правильно захвачена в закрытии (цикл for не определяет замыкание, для этого вам нужна функция).

Вот можно исправить:

redis.hmset("this:that:a", {"one": 'two', "three": 'four'}); 
redis.hmset("this:that:b", {"five": "six", "seven": "eight"}); 

var all_parts = {}; 

redis.keys("this:that:*", function(err, keys) { 

    var count = keys.length; 
    keys.forEach(function(key) { 
    redis.hgetall(key, function(err, obj) { 
     all_parts[key] = obj; 
     --count; 
     if (count <= 0) { 
     console.log(all_parts); 
     } else { 
     console.log('waiting'); 
     } 
    }); 
    }); 
}); 

возвращается:

waiting 
{ 'this:that:b': { five: 'six', seven: 'eight' }, 
    'this:that:a': { one: 'two', three: 'four' } } 

Посмотреть более подробную информацию по адресу:

hdel inside hget block nodejs redis

nodejs, redis. check if keys exists and create new if not

For loop get items from redis delay

+0

Хорошо, я вижу. Я думал, что «ключ» передается в область «redis.hgetall», а затем обратный вызов будет работать в этой области. Является ли 'redis.hgetall' не функцией, или я пропускаю что-то еще в AFA. – boom

+0

Да, но вам нужно определить переменную в объеме функции, чтобы она была частью закрытия. –