Когда асинхронный запуск client.hgetall
, он удаляет значение this
внутри hgetall
. Вы можете либо обернуть анонимную функцию, чтобы склеить это, либо использовать fn.bind()
, как показано ниже.
Вы также хотите избежать использования for .. in
для перебора массива. Используйте обычный цикл for или arr.forEach()
. Ваш пример был бы таинственно провален, как написано. Вот версия, которая, кажется, делает то, что вы хотите:
var async = require('async');
var redis = require('redis');
var keys = ['key1', 'key2', 'key3'];
var client = redis.createClient();
var multi = client.multi();
keys.forEach(function (key) {
multi.hmset(key, {'some': 'value'});
});
multi.exec(function(err, res) {
if (err) throw err;
console.dir(res);
var myCallback = function(err, res) {
console.log('in myCallback');
console.dir(res);
client.quit();
process.exit();
};
async.concat(keys, client.hgetall.bind(client), myCallback);
});
Это выводит:
[ 'OK', 'OK', 'OK' ]
in myCallback
[ { some: 'value' },
{ some: 'value' },
{ some: 'value' } ]
Чтобы отладить загадочный сбой, вы можете включить отладочную регистрацию в node_redis
, выполнив redis.debug_mode = true;
перед отправкой любых команд Redis.