javascript - fetch使用setinterval定时轮询的问题
黄舟
黄舟 2017-04-11 11:02:39
[JavaScript讨论组]

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(1)
PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号