redis hget возвращает нуль в фрагменте кода, но работает в redis-cli
for (i=0 ; i < pri.state.totalConversations; i++) {
redisclient.lindex("conversationsIDList",i, function(err,reply) {
convID = reply;
console.log("ConvID: " + "i: " + i + " "+ convID);
});
if(convID == pri.state.lastUpdatedConversationID)
break;
redisclient.hget("conversations", convID, function(err,reply) {
console.log("ConvID hget: "+ convID + " "+ reply);
data = JSON.parse(reply);
console.log("data: " +data);
});
выше приведен фрагмент моего кода. Команда redis-cli hget возвращает правильный ответ, который подтверждает, что у меня правильно настроен хэш с правильным ключом и полем / значениями. Однако приведенный выше фрагмент кода возвращает "null" для hget (convID имеет правильное значение, являющееся полем для hget) - я не понимаю, почему -
2 ответа
convID
не будет установлен, пока ваш redisclient.lindex
обратный вызов возвращается. Это не произойдет, пока ваш for
цикл давно завершен (поскольку цикл событий узла даже не будет запущен, пока вы не выйдете из цикла). Вы запускаете целую кучу асинхронных запросов redisclient
и не дожидаясь, пока кто-нибудь из них вернется.
Мне довольно сложно точно сказать, что вы хотите сделать, но вы, возможно, захотите взглянуть на библиотеки управления потоком, такие как Async.
Может быть возможно определить переменную логического флага (в области вашего модуля или любой другой функции, инициирующей ваш цикл), которая будет установлена вашим первым успешным обратным вызовом и будет указывать последующим обратным вызовам игнорировать их результаты. Но я просто догадываюсь. Основная проблема заключается в том, что вы пытаетесь использовать синхронный поток управления в асинхронной среде.
Проблема не в Redis, а в вашем понимании асинхронного программирования node.js. Клиентская библиотека Redis является асинхронной (как и большинство библиотек node.js). Вы не можете использовать его так, как если бы оно было синхронным.
Команда hget отправляется до того, как Redis сможет отправить результат команды lindex. Переменная convID не установлена на то, что вы ожидаете, в то время, которое вы ожидаете. Цикл for завершается до обработки любого результата.
Вы должны поместить весь код в зависимости от convID в обратный вызов lindex, и вам, вероятно, понадобится дополнительный обратный вызов в конце, который будет вызван после обработки всех результатов.
См. Пример в цикле For.