2012-06-10 7 views
0
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) - я не понимаю, почему -redis hget возвращает значение null в фрагменте кода, но работает в redis-cli

+0

спасибо за ответы, это работало, и я понимаю, лучше, оценить его. – user1447121

ответ

1

convID не будет установлен до тех пор, пока не вернется ваш обратный вызов redisclient.lindex. Это произойдет не до тех пор, пока цикл for не будет удален (поскольку цикл событий узла не запускается, пока вы не выйдете из цикла). Вы снимаете целую кучу асинхронных запросов до redisclient и не дожидаетесь, когда кто-нибудь из них вернется.

Мне сложно сказать точно, что вы хотите сделать, но вы можете захотеть посмотреть в библиотеки управления потоком, такие как Async.

Возможно, можно определить переменную логического флага (с областью действия к вашему модулю или любую другую функцию, инициированную вашим циклом), которая будет установлена ​​вашим первым успешным обратным вызовом и сообщит последующим обратным вызовам, чтобы игнорировать их результаты. Но я просто догадываюсь. Основная проблема заключается в том, что вы пытаетесь использовать синхронный поток управления в асинхронной среде.

+0

Спасибо, что помогает. Я тоже хочу проголосовать за этот ответ. – user1447121

1

Проблема не с Redis, а с вашим пониманием асинхронного программирования node.js. Клиентская библиотека Redis является асинхронной (как и большинство библиотек node.js). Вы не можете использовать его, как если бы он был синхронным.

Команда hget отправляется до того, как у Redis появилась возможность отправить результат команды lindex. Переменная convID не установлена ​​на то, что вы ожидаете, в ожидаемое время. Цикл for выходит до того, как любой результат может быть обработан.

Вы должны поместить весь код в зависимости от convID в обратном вызове lindex, и вам, вероятно, потребуется дополнительный обратный вызов в конце, который будет вызываться, когда все результаты будут обработаны.

Смотрите пример на For loop get items from redis delay