我有几个项目,我需要查询第三方API,并表示API的调用限制为每秒5次调用。我需要以某种方式将对API的调用限制在每秒最多5次调用。
到目前为止,我只是在一个promise数组上使用了Promise.all()
,其中每个promise向API发送一个请求,并在API响应HTTP状态码200
时进行解析,并在API响应其他状态码时拒绝。但是,当数组中的项目超过5个时,Promise.all()
可能会拒绝。
如何将Promise.all()
调用限制为每秒5次调用?
我有几个项目,我需要查询第三方API,并表示API的调用限制为每秒5次调用。我需要以某种方式将对API的调用限制在每秒最多5次调用。
到目前为止,我只是在一个promise数组上使用了Promise.all()
,其中每个promise向API发送一个请求,并在API响应HTTP状态码200
时进行解析,并在API响应其他状态码时拒绝。但是,当数组中的项目超过5个时,Promise.all()
可能会拒绝。
如何将Promise.all()
调用限制为每秒5次调用?
8条答案
按热度按时间j8ag8udp1#
使用ES6而不使用库
vu8f3i0k2#
我希望这对你有帮助。
也就是说,这将使用
Promise.all
来解决所有请求,如果你有一个很大的查询列表,这将等待所有的解决,并可能导致你的代码中有很多等待来获得所有的响应。如果其中一个请求被拒绝,Promise.all
也会拒绝。我建议,如果你不需要所有的结果放在一起,最好使用其他的东西,比如lodash debounce或throttle或处理这个问题的框架。
pgccezyw3#
如果你不太担心按顺序解析promise,你可以在bluebird中使用并发选项。
下面将处理5个查询在同一时间只。
knpiaxh14#
也许我头脑简单,但我写了这个版本,只是把传入的数组分成5个promise的块,并在每个块上执行
Promise.all()
:4bbkushb5#
我想你可以把你的问题分成两个:同时不超过5个呼叫,并确保最新的呼叫在最早的呼叫之后1秒才发生。
第一部分很容易用一个令人惊叹的p-limit库来解决--它拥有我所见过的最简单的接口。
对于第二部分,您需要实际跟踪每个呼叫何时开始-即。实现等待函数:基本的伪代码,没有测试过:
gudnpqoy6#
我们可以使用生成器来发送组中的promise列表。一旦第一个产量解决了,我们就可以做另一个产量。我们将结果存储在数组中。一旦promiseArray长度等于result长度,我们就可以解析 Package 的Promise。
kq0g1dla7#
这是阿德尔的答案,但是使用了typescript类型,并且还修复了传递给回调函数的索引和数组:
l5tcr1uw8#
我最近将几年来的vanilla ES6 solution I've been using重构为TypeScript,它一直工作得很好。
PromiseSettledResult
类型使用示例: