我希望在每次执行之间有一定的延迟的情况下,从nodejs应用程序执行少量的nodejs操作。
我正在使用雷迪斯客户端。节点版本v8.10.0
我想把它实现如下:
function func(id1, max){
for(i=0; i < max; i++){
client.incr(id1, (error, value) => {
if(error){
console.log("redis incr failed : " + error);
return error;
}
console.log("updated value : " + value);
});
sleep.sleep(1);
}
client.quit();
return("incr value ended for : " + id);
}
func(id1, max);但是在这种情况下,完整的redis incr会在一个范围内发生,而回调(console.log("updated value : " + value"))会延迟发生)。注意:对于上述代码中的sleep,我使用的是睡眠包。我还尝试了下面的解决方案(在googling之后找到):
var delay = 1000; //1 second
for (var i = 0; i < max; i++) {
setTimeout(() => {
client.incr(id, (error, value) => {
if(error){
console.log("redis incr failed : " + error);
return error;
}
console.log("updated value : " + value);
});
}, delay);
}但它的行为也与上面的行为相同。
Afaik,这是由于nodejs是synchronous和(我认为) node_redis客户端是async造成的。
TL;博士,我想做的是,使用nodejs在redis中每n秒钟增加一个键。
提前感谢!PS :我是nodejs的初学者。
发布于 2018-11-01 05:59:07
这是因为for循环执行并将所有回调放入延迟为1s的回调队列中。因此,只需修改for循环即可。
let delay = 1000; //1 second
for (let i = 0; i < max; i++) {
setTimeout(() => {
client.incr(id, (error, value) => {
if(error){
console.log("redis incr failed : " + error);
return error;
}
console.log("updated value : " + value);
});
}, delay);
delay += 1000;
}另外,请避免使用var,并开始使用支持const和let并正在安全提升的ES6语法。
https://stackoverflow.com/questions/53093895
复制相似问题