首页 > 解决方案 > 速率限制问题,循环通过动态 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 问题。

是否有解决方案:

我的代码看起来像这样:

requestPromise(arg1_a, arg2_a).then(res => delay(ms)).then(requestPromise(arg1_b, arg2_b)).then(res => delay(ms))...

对异步等待有什么帮助吗?我已经尝试过,但我似乎无法让它解决这个问题?也许是由于 Promises 和动态参数???不确定我是否理解如何将异步等待与动态承诺和迭代等结合起来......

任何帮助表示赞赏。

标签: javascriptloopspromiseasync-awaitrate-limiting

解决方案


Promises.all()可用于处理来自异步调用的 promise 的返回,但是为了处理并发请求的数量,http.request 代码需要限制调用的数量。设置https.globalAgent.maxSocket = 20对我来说是一项简单的工作。这显然是在向节点客户端发出请求时使用的。


推荐阅读