javascript - fetch使用setinterval定时轮询的问题

查看:191
本文介绍了javascript - fetch使用setinterval定时轮询的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

使用fetch,定时任务15s去轮询一次,已经打算改用websocket,但是还是奇怪下面代码的问题

function *pollForFunnelInfo() {
    while(true){
        yield fetch(`/funnel/getResultsByFunnelId?${qs.stringify({funnel_id: funnelId})}`, {
            method: 'get',
        }).then(d => d.json());
    }
}

function runPolling(generator) {
    let timer = null;
    if(!generator){
        generator = pollForFunnelInfo();
    }
    timer = setInterval(() => {
        var p = generator.next();
        p.value.then(function(data){
            if(data.errCode === 0){
                clearInterval(timer);
                put({
                    type: 'createResult',
                    payload: {
                        funnelName: data.funnel_name,
                        notificationType: 'info',
                        resultType: 'return'
                    }
                })

                returnSuccess(data);
            } else {
                runPolling(generator)
            }
        });
    }, 15000);

}
runPolling();

这段代码会发起轮询,但是轮询的频率不是我设定的时间,会1s内突然多几个请求,并且随着时间增加,发出的请求非常多,比方几分钟没看就有几千个请求了,估计是setinterval内部的实现原因,希望有人能解答,还有,如果我想用这种方式实现轮询,正确的姿势是什么

解决方案

fetch超过15000毫秒了的话,貌似会产生重复请求;fetch返回结果有错误的话,当前timer没有清掉,runPolling又产生一个新的;
想要多一些控制了,建议轮询不要使用setInterval,而是每次请求结束后产生一个只运行一次的setTimeout;非要用setInterval了,就没必要再去调用runPolling(generator)反正它自己会去定时调用的

这篇关于javascript - fetch使用setinterval定时轮询的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆