我想从redis
应用程序执行几个nodejs
操作,每次执行之间有一定的延迟。
我正在使用node_redis客户端。节点版本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
,我使用的是{{3 }}包。
我还尝试了以下解决方案(在谷歌搜索后找到):
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; DR
我想做的是使用redis
在nodejs
中每n秒增加一个密钥。
提前谢谢!
PS:我是nodejs
的初学者。
答案 0 :(得分:0)
这是因为执行for
循环并将所有回调以1秒的延迟放入回调队列中。因此,只需修改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语法。