我正在使用带有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 );
})
我在试着理解为什么一些简单的环路会以这样的速度运行 第一种情况: 根据IACA,吞吐量是1个周期,瓶颈是端口1,05。我不明白为什么它是1 cylce。毕竟我们有两个循环承载的依赖关系: 而且这种Latency是循环进行的,所以它应该会减慢我们的迭代。 第二种情况: 我更不明白为什么吞吐量是1.65。
我正在制作一个能同时接受多个运算符(例如5x5x5)的计算器。我有一个包含运算符位置的映射,以及它们的类型(x/+-)。我还有一个for循环,这是我从这篇文章中获得的。 为了得到左右的数字,我需要知道左右的运算符在哪里。我尝试将和与一起使用,如下所示: 但我想它不起作用,因为不是迭代器?我也不能递增/递减或(或者在本文中使用C++11版本时),所以我猜它不算迭代器?我不知道迭代器迷惑了我。 这篇文
问题内容: 在遍历列表的Python循环中,我们可以编写: 并巧妙地遍历列表中的所有元素。有没有办法知道循环中到目前为止我循环了多少次?例如,我要列出一个清单,在处理完10个元素之后,我想对它们进行处理。 我考虑过的替代方案可能是: 要么: 是否有更好的方法(就像)来获得到目前为止的迭代次数? 问题答案: pythonic的方法是使用:
我试图使用处理程序线程设置一个延迟的for循环。但是当我在for循环中设置处理程序线程时,我不能使用for循环的索引,因为它说它必须被称为final,但这也不起作用。有人知道怎么修吗?
问题内容: 因此,当我运行此代码时,我的JFrame变得无响应。我设法将其追溯到gameLoop()下的while循环。无论使用其中调用Thread.sleep()的delay(1000 / FRAMERATE),它都不允许键或鼠标侦听器执行其工作。 下面的完整代码,gameLoop()中存在问题 如果很重要,程序将从此处开始,然后转到Game类 可能无关紧要,但这是github存储库的插件htt
如何在不停止主GUI线程的情况下停止循环?(线程。睡眠(1000)未工作)