1

我正在使用带有 node_redis 的 Node.js 并循环遍历一个对象并在 Redis 中查找数据,然后返回结果。

我有这样的设置:

        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);

问题是它在完成对 redis 的调用之前循环。因此,在实际更新总值之前调用回调。由于延迟,它似乎也跳过了一些项目。

有没有更好的方法来处理这个?

谢谢!

编辑:

好的,所以我已经像这样更新它:

   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++;
               });
           };
       }

这似乎会起作用,它会在适当的时间触发回调,但是似乎只有最后一个键正在完全更新。

4

1 回答 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 );
})
于 2012-04-05T09:08:25.687 回答