十几个不同频率的轮训接口如何优化整理?

十几个不同频率的轮训接口如何优化整理?

一个页面有十几个数据模块,每个数据模块都是不同的接口,也有不同的更新频率,比如有的是10秒,有的是30秒,最快的1秒,最慢的60秒。

现在是每个接口一个settimeout去做轮训。

现在的优化思路是维护一个心跳接口,一秒钟一次,然后维护一个数字,数字是15的倍数就掉一次15的接口,60的倍数就调一次60的接口,但是担心自己处理不好这些逻辑。想问下有没有成熟的库来
做这些逻辑?


回答:

看上去 CRON Schedule 完全可以满足你的需求。如果不了解什么是 CRON,可以自己搜索一下。

这个上 npm 上一搜一大把。要注意看下是否支持 Browser,有一些是只能用在 Node.js 后端上的。

随便找了几个:

  • timexe
  • cron-schedule
  • cronosjs


回答:

大致是这么个逻辑

function loop:

for tick in schedule

n.update(now())

end

class Tick:

delay = 1000;

lastTime = 0;

update(time):

if time - lastTime >= delay

lastTime = time;

execute();


回答:

我个人觉得这个逻辑里面最应该注意的是:项目并发请求的量会不会超过浏览器的限制


回答:

不要用人的思维去思考程序 也不要强行为了舒服去写程序
为什么所有的轮询都一定要按照同样的节奏去运行
这种东西实际运行起来的时候 由于一般还要有重连和确认等机制 导致他们就是不同步的 各自跑各自的是常态


回答:

因为组件化的关系导致页面上的这种定时任务变化很大,如果统一处理的话稍有不慎就会产生资源浪费(例如组件已经销毁了,但是统一调度中忘记释放),所以我的思路是不去刻意处理这个事情,任由组件按自己的模式工作就好了。
但是request接口是统一封装的,所以在这里做一个处理就好了。例如组件A和组件B同时请求地址C,那么request接口会将其合并,从而避免重复请求,如果需要甚至可以加上一个短时缓存来进一步优化。不进行缓存优化的例子如下:

const loadingMap: {[key: string]: Promise<any>} = {};

const HTTPRequest = (url, options): Promise<any> => {

if (! options?.method || options.method.upperCase() === 'GET') {

const key = JSON.stringify({ url, params: options?.params || {} });

if (!loadingMap[key]) {

loadingMap[key] = doRequest(url, options).then(resolve => {

delete (requestingMap[key]);

return Promise.resolve(resolve);

}, reject => {

delete (requestingMap[key]);

return Promise.reject(reject);

});

}

return requestingMap[key];

}

return doRequest(url, options);

}

const doRequest = ... // 实际进行请求处理

以上是 十几个不同频率的轮训接口如何优化整理? 的全部内容, 来源链接: utcz.com/p/936613.html

回到顶部