前端实现并发请求。

 

 

 

需求:列表多页勾选实现批量打印流行病学问卷调查,打印出每一个患者(每一条数据)流行病学调查问卷。

分析:

通常多页勾选实现批量打印,我们的做法都是,将所有的数据统一传给后端的一个协议,但是这个需求比较特殊,用户要求单独一个患者有一份自己单独打印出来的问卷,同后端讨论后,我们为了实现需求,决定实现的方式为,勾选的数据分别去调用后端打印接口,实现批量单独打印。

方案确定后,我们有几个问题需要考虑:

1,如何发送请求,例如页面勾选100条,不可能一下子发送100个请求,因为浏览器有并发请求控制,如果超出并发数,后面的请求将会进入队列等候,我们在等候中的话  有可能会出现浏览器卡死。

2,如果单个继发,100条请求的话,必须要上一个结束再发送下一个请求,要等100次,这样效率也是很慢的。

那么为了解决上面两个问题,我们可以把两种方法综合一下,前端实现并发请求,

先并发假设5条,任意条成功之后,后面的队列加到前面的请求中。

相当于现在有5个水龙头在排队打水,假设第一个水龙头的人打完水,那么后面的一个人就排到第一个水龙头去,那么相当于前面有5个通道可以排队,大大减少了排队压力。

代码如何实现,以下代码为整体逻辑框架:

sendPrint = () => {
  const arrList = Array.from({length:100}, (v,k) => k); // 这边假设生成勾选的100条数据
  const limit = 5; // 并发请求数量

  // 请求后台打印协议
  const asyncMethond = () => {
    // some code
  }

  // 将所有数据定义成一个数组,这个数组的每一个元素返回一个函数,这个函数里面返回一个异步打印强求
  const asyncFunctionsHandles = arrList.map((item) => {
    return (task) => {
      return asyncMethond().then((res) => {
        const next = asyncFunctionsHandles.shift(); // 队列中还有等待,则取出等待的第一个
        if (next) {
          next(); // 执行这个
        } else {
          console.log('全部执行完成')
        }
      })
    }
  });

  const promiseList = [];
  // 实现并发请求
  for (let i = 0; i < limit; i ++) {
    const promiseItemFun = asyncFunctionsHandles.shift();
    promiseList.push(promiseItemFun());
  }

  Promise.all(promiseList).then((res) => {
    // 这边可以做一些全部请求完的操作
  })
}

 

posted @ 2020-08-13 16:34  木易锅巴  阅读(5841)  评论(3编辑  收藏  举报