For循环从redis延迟获取项目

我正在使用带有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++;

});

};

}

这似乎可行,它在适当的时间触发了回调,但是似乎只有最后一个键正在进行总更新。

回答:

您的第一个示例无法正常工作,因为循环是同步的,而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循环从redis延迟获取项目 的全部内容, 来源链接: utcz.com/qa/415947.html

回到顶部