javascript - 速率限制问题,循环通过动态 Promise 请求
问题描述
在向 api 发送许多请求时,我遇到了速率限制 429 的问题。我正在使用 api 的 Node.js 库通过 Javascript es-6 Promises 发出请求。
每个 Promise 接受两个参数,并且每个请求的参数都会改变。
我已经解决了速率限制问题,方法是用 .then() 链接承诺并包含一个延迟函数,该函数在 ??ms 之后返回已解决的承诺。
let delay = (time = delay_ms) => (result) => new Promise(resolve => setTimeout(() => resolve(result), time));
像这样的东西:
request(arg1, arg2)
.then(delay(300))
.then(request(arg1, arg2))
.then(delay(300))...
这解决了速率限制问题,但它确实让我不得不使用该解决方案编写大量代码,因为我必须编写大量代码。
我希望arg1
并且arg2
生活在单独的数组中,因此我可以遍历它们以动态构建承诺请求并在每个请求之间包含延迟。
我尝试使用 forEach 和 for 循环进行迭代,但请求都在彼此的毫秒内触发,再次创建了速率限制 429 问题。
是否有解决方案:
- ALL
arg1
可以存储在数组中let arr1 = ['USD', 'EUR' ...]
- ALL
arg2
可以存储在数组中let arr2 = [60, 300, 600 ...]
- 在哪里可以在每个请求之间使用 & 动态创建Promise
arr1
请求?arr2
delay()
我的代码看起来像这样:
requestPromise(arg1_a, arg2_a).then(res => delay(ms)).then(requestPromise(arg1_b, arg2_b)).then(res => delay(ms))...
对异步等待有什么帮助吗?我已经尝试过,但我似乎无法让它解决这个问题?也许是由于 Promises 和动态参数???不确定我是否理解如何将异步等待与动态承诺和迭代等结合起来......
任何帮助表示赞赏。
解决方案
Promises.all()
可用于处理来自异步调用的 promise 的返回,但是为了处理并发请求的数量,http.request 代码需要限制调用的数量。设置https.globalAgent.maxSocket = 20
对我来说是一项简单的工作。这显然是在向节点客户端发出请求时使用的。
推荐阅读
- php - Docusign Api - 使用复合模板时文档不会更改
- c# - 什么是“真实”?
- python - 将字典从模块返回到主模块
- html - Rvest - 使用 html 数据框而不是网页 - 并提取格式化标签
- python - 命令提示符中“main.py”和“python main.py”的区别
- arrays - 功能。2个二维数组,第二个全为0,应用条件后,将第一个二维数组的整行复制到第二个二维数组
- flutter - Flutter Text Overflow Animation 让全文可见
- http - http cookie 来自哪里,不是由“Set-Cookie”响应标头设置的?
- javascript - javascript clearInterval() function is not working
- c# - C#中windows子文件夹的访问被拒绝