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内部的实现原因,希望有人能解答,还有,如果我想用这种方式实现轮询,正确的姿势是什么

阅读 5.2k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题