使用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)
反正它自己会去定时调用的