Я пытаюсь извлечь все записи для определенных шаблонов ключей и сделать обратный вызов удачным, я использую Bluebird. Клиент redis для nodejs является node_redis для проекта.Извлечение данных из REDIS с помощью NODE JS и BLUEBIRD
Код в REDIS клиента -
exports.getAllRedisKeysA = function() {
var res = rclient.keysAsync("client*").then(function(data) {
// console.log(data);
}).then(function(data) {
var arrayResp = [];
for (var element in data) {
rclient.hgetallAsync(element).then(function(data) {
arrayResp.push(data);
});
};
return arrayResp;
// console.log(data);
}).catch(console.log.bind(console));
console.log(res); // gives an empty promise.
return res;
}
И эта функция вызывается из контроллера в следующей манере -
var abc = rdata.getAllRedisKeysA();
// console.log(abc); // gives undefined
console.log выход внутри функции REDIS дает оценку пустое обещание, и ничего не возвращается контроллеру.
Я пропустил что-нибудь в реализации?
'arrayResp' всегда будет пустым массивом, когда вы его возвращаете, потому что обещания не делают синхронный асинхронный код - также, в точке, где вы выполняете реестру консоли, это будет ожидающее обещание, потому что обещания не сделать асинхронный код синхронным –
Каков путь к этому? Как я могу это решить? – swateek
Прежде всего, вы должны использовать 'SCAN' вместо' KEYS' (http://redis.io/commands/keys). Во-вторых, как говорит @JaromandaX, вы не можете вернуть результат асинхронных операций. В-третьих, вы не должны использовать 'for (... in ...)' для массивов. Путь к этому - это вернуть обещание, когда вы принесете все ключи. Я не знаком с Bluebird, но [Promise.map] (http://bluebirdjs.com/docs/api/promise.map.html) кажется, ну, обещаю. –