对于循环得到redis的延迟项目(For loop get items from redis del

2019-06-23 10:30发布

我使用Node.js的W / node_redis和我通过一个对象循环和查找在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++;
               });
           };
       }

这似乎是它会工作,它触发在适当的时候回调,但似乎只有最后一个关键是让总更新。

Answer 1:

你的第一个例子不能工作,因为循环是同步的,而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 );
})


文章来源: For loop get items from redis delay