Promise 控制并发请求数量

2023-05-16

Promise 控制并发请求数量

前言:

浏览器对对同一个服务器的并发数是有限制的,参考如下表格(表格来源于网络,未进过严谨测试):

浏览器HTTP / 1.1HTTP / 1.0
IE 1166
IE 1066
IE 91010
IE 866
IE 6,724
火狐66
Safari 3,444
Chrome 4+66
歌剧 9.63,10.00alpha44
Opera 10.51+8
iPhone 24
iPhone 36
iPhone 44
iPhone 56
Android2-44

基于这个问题,加上多图上传的功能,就会出现 bug 了!!

如果接口请求超时时间为 5s,用户同时选择了 20-30 张图,每张图上传时间平均为 1s,并且图片用了分片上传

那就回得到,并发请求约等于 20,那么后面的请求就会被阻塞(注意只是阻塞,不过接口也在算时间了)。加上分片上传的逻辑,一张图片又被切为 3-4 个分片,再次分出 3-4 个请求~ 芜湖起飞

如果接口响应的慢,后面被阻塞的接口超过 5s 就就会被关闭,图片上传就被打断了,所以并发的请求不能给浏览器去帮我们挂起,而是要让我们自己控制

方案 1- async 和 await

这是最优雅的方案,代码量也少,上传图片只会上传完一张后在进行下一张,伪代码如下:

function uploadFn() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({ success: 11 })
    }, 2000)
  })
}

async function upload() {
  var _upload = uploadFn
  let array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  for (let index = 0; index < array.length; index++) {
    const element = array[index]
    console.log('循环开始')
    let res = await _upload.call(this)
    console.log(res, 'await结束')
  }
}

upload()

如果按上面的方式一次性拿到多张图,那倒问题不大,可是如果组件是重复调用,await 就控制不住了

upload()
upload()
upload()

所以还得从根源解决问题

limit-promise 并发请求控制

我也是看到一位大佬的博客,贴上他的 GitHub 仓库limit-promise

核心代码不长:

const LimitPromise = function(max) {
  this._max = max
  this._count = 0
  this._taskQueue = []
}

LimitPromise.prototype.call = function(caller, ...args) {
  return new Promise((resolve, reject) => {
    const task = this._createTask(caller, args, resolve, reject)
    if (this._count >= this._max) {
      // console.log('count >= max, push a task to queue')
      this._taskQueue.push(task)
    } else {
      task()
    }
  })
}

LimitPromise.prototype._createTask = function(caller, args, resolve, reject) {
  return () => {
    caller(...args)
      .then(resolve)
      .catch(reject)
      .finally(() => {
        this._count--
        if (this._taskQueue.length) {
          // console.log('a task run over, pop a task to run')
          let task = this._taskQueue.shift()
          task()
        } else {
          // console.log('task count = ', count)
        }
      })
    this._count++
    // console.log('task run , task count = ', count)
  }
}

if (typeof Promise.prototype.finally !== 'function') {
  Promise.prototype.finally = function(callback) {
    let P = this.constructor
    return this.then(
      value => P.resolve(callback()).then(() => value),
      reason =>
        P.resolve(callback()).then(() => {
          throw reason
        })
    )
  }
}

module.exports = LimitPromise

使用的时候

const LimitPromise = require('limit-promise')

// 引入自己写的请求的方法
const request = require('./request')

const MAX = 5

// 设置并发请求数量
const limitP = new LimitPromise(MAX)

// 重新封装一下请求的方法,最后都用 limitP 去发请求
function get(url, params) {
  return limitP.call(request.get, url, params)
}

function post(url, params) {
  return limitP.call(request.post, url, params)
}

module.exports = { get, post }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise 控制并发请求数量 的相关文章

随机推荐

  • 非线性控制1.1——稳定与跟踪问题概念

    一 非线性控制系统的两大任务 1 稳定 xff08 或称调节 xff09 问题 稳定问题是要使得闭环系统的状态稳定在一个平衡点附近 对于稳定问题 xff0c 系统的输出不一定要有具体的物理意义 xff0c 此时可以借助输入 输出状态线性化方
  • 在 linux ubuntu 18.04 上运行QQ音乐

    在 linux ubuntu 18 04 上运行QQ音乐 我使用的组合为 ubuntu 18 04 43 wine stable 3 6 43 QQ音乐17 63 xff0c 未在其它平台做过尝试 一直想在ubuntu上好好听音乐 xff0
  • 非线性控制1.0——自适应控制和鲁棒控制

    1 鲁棒控制和自适应控制的联系与区别 鲁棒控制是以目的定义的控制方法集合 xff0c 自适应控制是以手段定义的控制方法集合 xff0c 这两种控制都是为了应对 当数学模型不能精确表示实际系统的情况下 狭义的鲁棒控制是指H2 xff0c Hi
  • 非线性控制2.0——鲁棒控制之H无穷控制器设计

    一 基本概念 对于图1所示系统 xff0c u为控制输入 xff0c y为测量输出 xff0c z为被调输出 xff0c w为干扰输入 xff0c 由输入u xff0c w到输出y xff0c z的传递函数G成为增广被控对象 xff0c 控
  • 非线性控制1.0——控制理论生态及结构

    一 控制理论地图 二 控制理论发展及结构 上图应用于 xff1a https www zhihu com people xiang yi 55 49 answers
  • 四旋翼飞行器——飞行原理

    1 机械结构 旋翼对称分布在机体的前后 左右四个方向 xff0c 四个旋翼处于同一高度平面 xff0c 且四个旋翼的结构和半径都相同 xff0c 四个电机对称的安装在飞行器的支架端 xff0c 支架中间空间安放飞控板 结构形式如图 1 1所
  • 四旋翼飞行器——非线性化模型

    一 建模思路 该模型目标控制量是机体相对于地面坐标系的线速度的三个分量Vx xff0c Vy xff0c Vz xff0c 而我们能控的实质上只有四个电机的转速W1 xff0c W2 xff0c W3 xff0c W4 怎样由输入一步步推导
  • 故障诊断4—龙伯格状态观测器设计

    1 龙伯格状态观测器概念 已经线性系统模型如下 xff1a 当系统状态量难以获取 xff0c 但实际控制中又需要利用系统状态量时 xff0c 如何通过输入量和输出量重构系统状态量 xff1f 这便是龙伯格状态观测器设计初衷 xff0c 将实
  • 故障诊断5——状态观测器和输出观测器

    1 状态观测器分类 在现代控制理论中 xff0c 控制系统的基本结构和经典控制理论一样 xff0c 仍然是由受控对象和反馈控制器两部分构成的闭环系统 不过在经典理论中习惯于采用输出反馈 xff0c 而在现代控制理论中则更多地采用状态反馈 由
  • GPS漂移和定位不准确的解决办法

    解决GPS漂移主要从两方面入手 xff1a 一 主系统的设计主要减少在近距离内对GPS信号的干扰 二 软件处理 软件处理主要集中在导航软件处完成 xff0c 导航软件会将坐标定位在道路之内 xff0c 如果GPS接收到的信号超出道路的半径范
  • AI---是什么?可以做什么?

    1 AI的项目简单介绍 图像识别 描述 xff1a 给定图片 xff0c 识别图片中有什么 xff1f 算法 xff1a KNN CNN 情感分析 描述 xff1a 判断文本包含的情感是正面 负面还是中性 关键 xff1a 文本如何表示成向
  • realsense的安装问题

    realsense的安装问题 0 旁白1 SDK的安装2 python开发包的安装3 nodejs开发包的安装方法1 xff1a 方法2 xff1a 接手一位同事的realsense相关项目 xff0c 先配置一个环境 xff0c 出现不少
  • 二叉排序树的删除

    xff08 网上讲二叉排序树删除的资料很少 xff0c 这篇很不错 xff01 转自 xff1a http bbs csdn net topics 110010437 xff09 二叉排序树的删除 xff1a 对于一般的二叉树来说 xff0
  • 分布式锁学习

    概述 分布式锁是控制分布式系统之间同步访问共享资源的一种方式 在分布式系统中 xff0c 常常需要协调他们的动作 如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源 xff0c 那么访问这些资源的时候 xff0c 往往需要互斥来
  • 无人机飞行控制

    intro 这篇笔记记录了无人机飞控算法和px4相关 control algorithm adrc 周立功讲adrc 参数整定 xff1a Scaling and Bandwidth Parameterization
  • 168-HITL-dev-manual

    HITL todo 使用mavlink收ref和imu 可以选择发出pwm和torque 发出torque的话 xff0c 没有考虑pwm的饱和 发出pwm的话 xff0c 电机的参数也不准 参考GAAS FC 写收的imu gps xff
  • 图优化理论(1)

    简介 图优化本质上是一个优化问题 xff0c 所以我们先来看优化问题是什么 优化问题有三个最重要的因素 xff1a 目标函数 优化变量 优化约束 一个简单的优化问题可以描述如下 其中x为优化变量 xff0c 而F x 为优化函数 此问题称为
  • (动态添加select后不显示?)layui动态添加select后重新渲染

    一 问题 xff1a 利用jQuery动态添加的代码中包含select xff0c 运行后不显示 1 显示的状态 2 后台的代码 正常情况下应该像队长班级一样显示 xff0c 但是却惊奇的发现 xff0c 事与愿违 二 原因 Layui会对
  • ARM处理器的快速上下文切换技术

    5 3 1 FCSE 概述 FCSE xff08 Fast Context Switch Extension xff0c 快速上下文切换 xff09 位于 CPU 和 MMU 之间 xff0c 如果两个进程使用了同样的虚拟地址空间 xff0
  • Promise 控制并发请求数量

    Promise 控制并发请求数量 前言 xff1a 浏览器对对同一个服务器的并发数是有限制的 xff0c 参考如下表格 xff08 表格来源于网络 xff0c 未进过严谨测试 xff09 xff1a 浏览器HTTP 1 1HTTP 1 0I