for循环从redis延迟获取项目

我正在使用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的调用之前,它会循环。 因此,在实际更新总值之前调用callback函数。 由于延误,似乎也略过了一些项目。

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

谢谢!

编辑:

好的,我已经更新了

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

这似乎是可行的,它会在适当的时候触发callback,但似乎只有最后一个键是全面更新。

你的第一个例子不能工作,因为一个循环是同步的,而Redis客户端调用是asynchronous的。 由于Javascriptclosurespipe理,你的第二个例子不会好得多。 你需要在循环中有一个合适的范围,所以闭包处理正确,并且所有的字段都相应地更新。

在这里使用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 ); })