首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将Promise.all()限制为每秒5个promises?

Promise.all() 是 JavaScript 中的一个方法,用于并行执行多个 Promise 对象,并在所有 Promise 都成功时返回一个包含所有结果的数组。然而,当 Promise 数量非常大时,可能会导致性能问题或资源耗尽。为了限制每秒执行的 Promise 数量,可以使用一种称为“限流”(Rate Limiting)的技术。

以下是一个示例代码,展示如何使用 p-limit 库来限制每秒执行的 Promise 数量为 5 个:

代码语言:txt
复制
const pLimit = require('p-limit');

// 创建一个限流器,每秒最多执行 5 个 Promise
const limit = pLimit(5);

// 假设我们有一个生成 Promise 的函数
function createPromise(value) {
  return new Promise((resolve) => {
    setTimeout(() => resolve(value), Math.random() * 1000);
  });
}

// 生成 20 个 Promise
const promises = Array.from({ length: 20 }, (_, i) => createPromise(i));

// 使用限流器包装每个 Promise
const limitedPromises = promises.map((promise) => limit(() => promise));

// 等待所有限流后的 Promise 完成
Promise.all(limitedPromises)
  .then((results) => console.log('All promises resolved:', results))
  .catch((error) => console.error('Error:', error));

解释

  1. p-limit 库:这是一个用于限流的库,可以轻松地限制并发执行的数量。
  2. 限流器:通过 pLimit(5) 创建一个限流器,表示每秒最多执行 5 个 Promise。
  3. 生成 PromisecreatePromise 函数用于生成随机的 Promise。
  4. 限流后的 Promise:使用 limit(() => promise) 包装每个 Promise,使其受限于限流器。
  5. 等待所有 Promise 完成:使用 Promise.all(limitedPromises) 等待所有限流后的 Promise 完成。

优势

  • 控制并发:避免过多的并发请求导致资源耗尽或性能问题。
  • 稳定性:确保系统在高负载下仍能稳定运行。

应用场景

  • API 请求:限制对第三方 API 的请求频率,避免被封禁。
  • 数据处理:在处理大量数据时,控制处理速度以避免系统过载。
  • 任务调度:在任务调度系统中,控制任务的并发执行数量。

参考链接

通过这种方式,你可以有效地控制每秒执行的 Promise 数量,从而提高系统的稳定性和性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 新手们容易在Promise上挖的坑~

    #2 不知如何将Promise和forEach结合 这里是大多数人对于 promises 的理解开始出现偏差。...一旦当他们要使用他们熟悉的 forEach() 循环 (无论是 for 循环还是 while 循环),他们完全不知道如何将 promises 与其一起使。因此他们就会写下类似这样的代码。 ?...你需要的是 Promise.all(): ? 上面的代码是什么意思呢?大体来说,Promise.all()会以一个 promises 数组为输入,并且返回一个新的 promise。...并且 Promise.all() 会将执行结果组成的数组返回到下一个函数,比如当你希望从 PouchDB 中获取多个对象时,会非常有用。...此外一个更加有用的特效是,一旦数组中的 promise 任意一个返回错误,Promise.all() 也会返回错误。 #3 忘记使用.catch() 这是另一个常见的错误。

    1.5K50

    Js 异步处理演进,Callback=u003EPromise=u003EObserver

    如何将水管巧妙连通,使整个系统有足够的弹性,需要去认真思考 对于 JavaScript 异步的理解,不少人感到过困惑:Js 是单线程的,如何做到异步的呢?...) .then(callApiFooB) .then(callApiFooC) .catch(fail) 与此同时,Promise 还提供了很多其它更具扩展性的解决方案,比如 Promise.all...、Promise.race 等; // Promise.all:并发执行,全部变为 resolve 或 有 reject 状态出现的时候,它才会去调用 .then 方法; function callApiFooA...+'/'+resA.id+'/'+resB.id); } function callApiFooD(resC){ return fetch(url+'/'+resC.id); } Promise.all...callApiFooD( resC ) )), tap((resD) => console.log(resD)) ).subscribe(); 详细过程: Observable.from 将一个 Promises

    2K10

    「译」更快的 async 函数和 promises

    不过,这一切正在改变,这篇文章会详细解释我们是如何优化 V8 引擎(也会涉及一些其它引擎)里的 async 函数和 promises 的,以及伴随着的开发体验的优化。...异步编程的新方案 从 callbacks 到 promises,再到 async 函数 在 promises 正式成为 JavaScript 标准的一部分之前,回调被大量用在异步编程中,下面是个例子:...另一方面,parallel 基准测试 反应的是重度使用 Promise.all() 的性能情况,结果如下: Promise.all 的性能提高了八倍!...上面是基于市场上流行的 HTTP 框架做的测试,这些框架大量使用了 promises 和 async 函数,这个表展示的是每秒请求数,所以跟之前的表不一样,这个是数值越大越好。...结论 async 函数变快少不了以下两个优化: 移除了额外的两个微任务 移除了 throwaway promise 除此之外,我们通过 零成本异步栈追踪 提升了 await 和 Promise.all(

    1.1K10

    基于kubernetes的分布式限流

    一、概念 限流(Ratelimiting)指对应用服务的请求进行限制,例如某一接口的请求限制为 100 个每秒,对超过限制的请求则进行快速失败或丢弃。...1.2 维度 对于限流场景,一般需要考虑两个维度的信息: 时间 限流基于某段时间范围或者某个时间点,也就是我们常说的“时间窗口”,比如对每分钟、每秒钟的时间窗口做限定 资源 基于可用资源的限制,比如设定最大访问次数...限流就是在某个时间窗口对资源访问做限制,比如设定每秒最多100个访问请求。...对于极致追求高性能的服务不需要考虑熔断、降级来说,是需要尽量减少网络之间的IO,那么是否可以通过一个总频然后分配到具体的单机里面去,在单机中实现平均的限流,比如限制某个ip的qps为100,服务总共有...在k8s中,服务是动态扩缩容的,相应的,每个节点应该都要有所变化,如果对外宣称频100qps,而且后续业务方真的要求百分百准确,只能把LoadingCache

    1.8K10

    async 函数和 promises 的性能提升

    不过,这一切正在改变,这篇文章会详细解释我们是如何优化 V8 引擎(也会涉及一些其它引擎)里的 async 函数和 promises 的,以及伴随着的开发体验的优化。...异步编程的新方案 从 callbacks 到 promises,再到 async 函数 在 promises 正式成为 JavaScript 标准的一部分之前,回调被大量用在异步编程中,下面是个例子:...-1.image_-3-1.png Promise.all 的性能提高了八倍!...和 async 函数,这个表展示的是每秒请求数,所以跟之前的表不一样,这个是数值越大越好。...结论 async 函数变快少不了以下两个优化: 移除了额外的两个微任务 移除了 throwaway promise 除此之外,我们通过 零成本异步栈追踪 提升了 await 和 Promise.all(

    72320

    如何构建一个多人(.io) Web 游戏,第 1 部分

    您所需要的只是 Javascript 的实用知识:您应该熟悉 ES6 语法,this 关键字和 Promises之类的内容。...document.getElementById('play-button'); const usernameInput = document.getElementById('username-input'); Promise.all...assets.js const ASSET_NAMES = ['ship.svg', 'bullet.svg']; const assets = {}; const downloadPromise = Promise.all...此实现存在问题的原因之一是因为它将渲染帧速率限制为服务器 tick 速率。 Frame Rate:每秒的帧数(即,render()调用)或 FPS。游戏通常以至少 60 FPS 为目标。...对于我们的游戏,服务器以每秒30 ticks 的速度运行。 如果我们仅提供最新的游戏更新,则我们的有效 FPS 不能超过 30,因为我们永远不会从服务器每秒收到超过 30 的更新。

    1.3K10

    高并发核心编程SpringCloud+Nginx秒杀实战,秒杀系统的系统架构

    图10-3 外部网关与内部网关相结合完成权限认证、负载均衡、接口 流 3.业务层负责保障数据一致性 秒杀的业务逻辑主要是下订单和减库存,都是数据库操作。...假定要配置Nginx虚拟主机的限流规则为单IP限制为每秒1次请求,整个应用限制为每秒10次请求,那么具体的配置如下: limit_req_zone $binary_remote_addr zone=perip...module/seckill/getToken.lua; } } 以上定义了两个限流规则:pergood和peruser:pergood规则根据请求参数的goodId值进行限流,同一个goodId值的限速为每秒...100次请求;peruser规则根据请求参数的userId值进行限流,同一个userId值的限速为每秒1次请求。...本书的秒杀练习使用的是接口级别的限流策略,在获取秒杀令牌的REST接口时,针对每个秒杀商品的ID配置限流策略,限制每个商品ID每秒内允许通过的请求次数。

    68120
    领券