返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js Promise并发控制数量的方法
  • 550
分享到

js Promise并发控制数量的方法

2024-04-02 19:04:59 550人浏览 薄情痞子
摘要

目录问题背景思路 & 实现问题 要求写一个方法控制 Promise 并发数量,如下: promiseConcurrencyLimit(limit, array, ite

问题

要求写一个方法控制 Promise 并发数量,如下:


promiseConcurrencyLimit(limit, array, iteratorFn)

limit 是同一时间执行的 promise 数量,array 是参数数组,iteratorFn 每个 promise 中执行的异步操作。

背景

开发中需要在多个promise处理完成后执行后置逻辑,通常使用Promise.all:


Primise.all([p1, p2, p3]).then((res) => ...)

但是有个问题是,因为 promise 创建后会立即执行,也就是说传入到 promise.all 中的多个 promise 实例,在其创建的时候就已经开始执行了,如果这些实例中执行的异步操作都是 Http 请求,那么就会在瞬间发出 n 个 http 请求,这样显然是不合理的;更合理的方式是:对 Promise.all 中异步操作的执行数量加以限制,同一时间只允许有 limit 个异步操作同时执行。

思路 & 实现

在背景中提到,promise 在创建后就会立即执行,所以控制并发的核心在于控制 promise 实例的生成。最开始只生成 limit 个 promise 实例,然后等待这些 promise 状态变更,只要其中某一个 promise 实例的状态发生变更,就立即再创建一个 promise 实例...如此循环,直到所有的 promise 都被创建并执行。

npm 上有很多库实现了此功能,个人觉得 tiny-async-pool 这个库比较好,因为它直接使用了原生的 Promise 实现了此功能,而其他库大多重新实现了 promise。其核心代码如下:


async function asyncPool(poolLimit, array, iteratorFn) {
  const ret = []; // 用于存放所有的promise实例
  const executing = []; // 用于存放目前正在执行的promise
  for (const item of array) {
    const p = Promise.resolve(iteratorFn(item)); // 防止回调函数返回的不是promise,使用Promise.resolve进行包裹
    ret.push(p);
    if (poolLimit <= array.length) {
      // then回调中,当这个promise状态变为fulfilled后,将其从正在执行的promise列表executing中删除
      const e = p.then(() => executing.splice(executing.indexOf(e), 1));
      executing.push(e);
      if (executing.length >= poolLimit) {
        // 一旦正在执行的promise列表数量等于限制数,就使用Promise.race等待某一个promise状态发生变更,
        // 状态变更后,就会执行上面then的回调,将该promise从executing中删除,
        // 然后再进入到下一次for循环,生成新的promise进行补充
        await Promise.race(executing);
      }
    }
  }
  return Promise.all(ret);
}

测试代码如下:


const timeout = (i) => {
  console.log('开始', i);
  return new Promise((resolve) => setTimeout(() => {
    resolve(i);
    console.log('结束', i);
  }, i));
};

(async () => {
    const res = await asyncPool(2, [1000, 5000, 3000, 2000], timeout);
    console.log(res);
  })();

代码的核心思路为:

  • 先初始化 limit 个 promise 实例,将它们放到 executing 数组中
  • 使用 Promise.race 等待这 limit 个 promise 实例的执行结果
  • 一旦某一个 promise 的状态发生变更,就将其从 executing 中删除,然后再执行循环生成新的 promise,放入executing 中
  • 重复2、3两个步骤,直到所有的 promise 都被执行完
  • 最后使用 Promise.all 返回所有 promise 实例的执行结果

到此这篇关于js Promise并发控制数量的方法的文章就介绍到这了,更多相关js Promise并发控制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: js Promise并发控制数量的方法

本文链接: https://lsjlt.com/news/133705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • js Promise并发控制数量的方法
    目录问题背景思路 & 实现问题 要求写一个方法控制 Promise 并发数量,如下: promiseConcurrencyLimit(limit, array, ite...
    99+
    2024-04-02
  • golang控制并发数量的方法是什么
    在golang中,可以使用goroutine和channel来控制并发数量。以下是一些常用的方法: 使用goroutine和Wai...
    99+
    2023-10-21
    golang
  • JS中的Promise.race控制并发量应用
    这篇文章主要讲解了“JS中的Promise.race控制并发量应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS中的Promise.race控制并发量应用”吧!一、Promise.rac...
    99+
    2023-07-05
  • 深入理解JS中的Promise.race控制并发量
    目录开篇一、Promise.race二、并发效果展示三、代码总结与思考开篇 比如在开发中会进行一系列的网络请求,但是有些情况需要控制一下网络请求请并发量。这里简单的用 Promise...
    99+
    2023-05-14
    JS Promise.race 控制并发量 JS Promise.race
  • Promise面试题详解之控制并发
    前言 在写这篇文章的时候我有点犹豫,因为先前写过一篇类似的,一道关于并发控制的面试题,只不过那篇文章只给出了一种解决方案,后来在网上又陆续找到两种解决方案,说来惭愧,研究问题总是浅尝...
    99+
    2024-04-02
  • JavaScript如何利用Promise控制并发请求个数
    一、场景 假设现在有这么一种场景:现有 30 个异步请求需要发送,但由于某些原因,我们必须将同一时刻并发请求数量控制在 5 个以内,同时还要尽可能快速的拿到响应结果。 如图所示: ...
    99+
    2024-04-02
  • golang怎么控制并发数量
    在Go语言中,可以使用goroutine和channel来控制并发数量。 首先,可以使用goroutine来并发执行任务。例如,有一...
    99+
    2023-10-26
    golang
  • golang控制并发数的方法是什么
    在Golang中,可以使用goroutine和channel来控制并发数。以下是几种常见的方法: 通过控制goroutine的数...
    99+
    2023-10-27
    golang
  • 怎么在JavaScript中使用Promise控制并发请求个数
    这篇文章给大家介绍怎么在JavaScript中使用Promise控制并发请求个数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。串行:一个异步请求完了之后在进行下一个请求并行:多个异步请求同时进行串行举例:var&nbs...
    99+
    2023-06-15
  • Java高并发下的流量控制方法是什么
    今天小编给大家分享一下Java高并发下的流量控制方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。这个时候如果不做任何...
    99+
    2023-06-16
  • MySQL 加锁控制并发的方法
    前言 锁总体可以分为乐观锁和悲观锁,简单说,乐观锁用版本号控制,悲观锁用锁控制。 下面是待会要用来测试的数据 # 添加一个user表 CREATE TABLE `users` ( `id` int(11) N...
    99+
    2022-05-14
    MySQL 加锁 MySQL 并发
  • Golang 语言控制并发 Goroutine的方法
    goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。 01介绍 G...
    99+
    2024-04-02
  • JavaScript中实现并发控制的方法
    这篇文章将为大家详细讲解有关JavaScript中实现并发控制的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、并发控制简介在日常开发过程中,你可能会遇到并发控制的场景,比如控制请求并发数。那么在 ...
    99+
    2023-06-15
  • golang并发控制的方法是什么
    在Go语言中,可以使用以下几种方法来控制并发:1. Goroutine:Goroutine是Go语言中的轻量级线程,可以通过go关键...
    99+
    2023-10-20
    golang
  • golang并发控制的方法有哪些
    在Golang中,有多种方法可以实现并发控制。以下是其中一些常用的方法: 互斥锁(Mutex):使用互斥锁可以保护共享资源免受并...
    99+
    2024-02-29
    golang
  • JMeter 控制并发数
    文章目录 一、误区二、正确设置 JMeter 的并发数总结 没用过 JMeter 的同学,可以先过一遍他的简单使用例子 https://blog.csdn.net/weixin_42132143/article/detai...
    99+
    2023-08-18
    jmeter java 开发语言
  • go中控制goroutine数量的方法
    前言 goroutine被无限制的大量创建,造成的后果就不啰嗦了,主要讨论几种如何控制goroutine的方法 控制goroutine的数量 通过channel+sync ...
    99+
    2022-06-07
    goroutine GO 方法
  • JavaScript使用Promise实现并发请求数限制
    目录没有Promise的并发请求使用Promise限制并发请求使用Promise实现并发请求数限制总结没有Promise的并发请求 在Web开发中,我们经常需要发起多个异步请求来获取...
    99+
    2023-05-16
    JavaScript Promise并发请求限制 Promise限制并发请求 JS promise限制并发
  • python 协程并发数控制
    目录多线程之信号量协程中使用信号量控制并发aiohttp 中 TCPConnector 连接池前言: 本篇博客要采集的站点:【看历史,通天下-历史剧网】 目标数据是该站点下的热门历史...
    99+
    2024-04-02
  • golang怎么控制并发数
    在Go中,可以使用goroutine和channel来控制并发数。 首先,可以使用make函数创建一个带有指定并发数的channel...
    99+
    2023-10-21
    golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作