首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs延迟执行redis命令

nodejs延迟执行redis命令
EN

Stack Overflow用户
提问于 2018-11-01 01:02:04
回答 1查看 659关注 0票数 0

我希望在每次执行之间有一定的延迟的情况下,从nodejs应用程序执行少量的nodejs操作。

我正在使用雷迪斯客户端。节点版本v8.10.0

我想把它实现如下:

代码语言:javascript
复制
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之后找到):

代码语言:javascript
复制
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;博士,我想做的是,使用nodejsredis中每n秒钟增加一个键。

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

EN

回答 1

Stack Overflow用户

发布于 2018-11-01 05:59:07

这是因为for循环执行并将所有回调放入延迟为1s的回调队列中。因此,只需修改for循环即可。

代码语言:javascript
复制
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语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53093895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档