Вопрос по node.js, redis, javascript – За цикл получить предметы из Redis Delay

1

Я использую Node.js с node_redis, и я зацикливаюсь на объекте и ищу данные в Redis, а затем возвращаю результаты.

У меня это настроено так:

<code>        for (var key in items) {
            if (items.hasOwnProperty(key)) {

                    app.client.llen(items[key].id+'_click', function(err, total) {
                        items[key].total = total;

                    });
            }
        }

       callback(items);
</code>

Проблема в том, что он проходит до завершения вызова redis. Таким образом, обратный вызов вызывается до того, как он фактически обновит общее значение. Также кажется, что некоторые пункты пропускаются из-за задержки.

Есть ли лучший способ справиться с этим?

Спасибо!

РЕДАКТИРОВАТЬ:

Итак, я обновил его так:

<code>   getTotal(function () {
       callback(items);
   });

   getTotal = function (callback) {

       var count = 1;

       for (var key in items) {
           if (items.hasOwnProperty(key)) {
               app.client.llen(items[key].id + '_click', function (err, total) {
                   items[key].total = total;

                   if (items.length == count) {
                       callback();
                   }

                   count++;
               });
           };
       }
</code>

Похоже, что это будет работать, он вызывает обратный вызов в соответствующее время, однако кажется, что только последний ключ обновляется полностью.

Хм, внутри цикла for или вместо него? dzm
Вы пробовали рекурсивную версию? Sergio Tulentsev

Ваш Ответ

1   ответ
2

Ваш первый пример не может работать, потому что цикл является синхронным, в то время как вызовы клиента Redis являются асинхронными. Ваш второй пример не работает намного лучше из-за управления закрытием Javascript. Вам нужна правильная область действия в самом цикле, чтобы замыкание обрабатывалось правильно, и все общие поля обновлялись соответствующим образом.

Использование forEach здесь проще:

getTotal = function (callback) {
  var count = 0;
  Object.keys( items ).forEach( function(key) {
    ++count;
    app.client.llen(items[key].id + '_click', function (err, total) {
      items[key].total = total;
      if ( --count == 0 ) {
        callback( items );
      }
    })
  })
}

getTotal( function(items) {
  console.log( items );
})
Спасибо за ваш ответ! Я застрял в подобной проблеме, и твой код дал мне подсказки, которые мне нужны, чтобы мои вещи работали.

Похожие вопросы