大数据表单元格批量请求优化方案

背景

在表格组件中,每个单元格是一个vue实例,数据请求、数据处理、数据展示都由组件内部管理,虽然原则上实现了数据的解耦,但是也引入了一个问题,即数据的请求次数与单元格的数量呈正相关,导致在大量单元格渲染的场景下,请求发送特别频繁

优化思路

仔细观察表格内的场景以及单元格的请求格式,会发现两个特点:

  1. 同一列的单元格请求的数据接口是一样的,参数类似
  2. 数据接口往往支持批量处理

既然如此,是否可以将一定时间段内的请求参数合并去重后再提交,以达到减少请求的目的

方案

请求队列

此方案适合参数根据单元格的具体内容填入请求参数的场景
在这里插入图片描述

方案流程:
  1. 各单元格将要请求的数据推送到批量请求模块中,通过回调函数等待回调数据
  2. 请求队列通过一个worker中的定时触发器来控制消费速度
  3. 调度信号来了以后,将当前请求数据合并去重,然后发起请求
  4. 请求成功后将数据抛给回调函数,触发组件更新
为什么要把队列触发器放在worker?

大数据场景下,单元格渲染很慢。如使用setTimeout防抖会导致发送请求的时间推迟到所有单元格渲染完成,出现长时间白屏;如使用setInterval节流,主线程被渲染卡住导致setInterval一直被延后到所有单元格渲染完成,也会出现长时间白屏。这里采用把请求队列的调度放到worker里的方案

代码示例
const MAX_REQUEST_COUNT = 100;
const queue = {
   
	codes: [],
	callbacks: []
}

// 外部调用
const batchGetter = (
    codes: string[],
    callback: (data: any[]) => void,
) => {
   
  queue.codes = queue.codes.concat(codes);
  queue.callbacks.push(callback);
  worker.postMessage({
   
    method: 'start',
    id: 'batchGetter',
    interval: 100,
  });
};

// 发起请求
const startRequest = async () => {
   
  const len = queue.codes.length;

  if (!len) {
   
    worker.postMessage({
   
      method: 'stop',
      id: 'batchGetter',
    });
    return
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTao-z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值