zoukankan      html  css  js  c++  java
  • 前端实现并发请求。

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

    分析:

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

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

    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) => {
        // 这边可以做一些全部请求完的操作
      })
    }
  • 相关阅读:
    图片验证码, 登录, 注销, 修改密码
    注册页面及注册功能实现
    高级配置文件, csrf, django settings源码, django auth模块, 文件配置的插拔式设计
    cookie操作, session操作, django中间件
    半自动创建多对多关系表, forms组件
    sweetalert, bulk_create, 分页器
    orm查询优化, MVC与MTV, choices参数, ajax
    聚合查询, 分组查询, F与Q查询, 常见字段及参数, 自定义Char字段, 事务操作
    Contest2058
    ACM版《孔乙己》
  • 原文地址:https://www.cnblogs.com/yxfboke/p/13497196.html
Copyright © 2011-2022 走看看