您的第一个示例无法正常工作,因为循环是同步的,而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 );
})