node.js延迟执行redis命令

时间:2018-11-01 01:02:04

标签: node.js asynchronous redis sleep

我想从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 我想做的是使用redisnodejs中每n秒增加一个密钥。

提前谢谢! PS:我是nodejs的初学者。

1 个答案:

答案 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并开始使用支持constlet并且可以安全吊起的ES6语法。

相关问题