【发布时间】:2020-09-22 09:15:32
【问题描述】:
我正在尝试限制发送到 API 的请求数量。
我正在使用 Limiter,它的工作方式与我的需要一样,唯一的问题是我找不到将它与 await 一起使用的方法(在呈现我的页面之前我需要所有响应)
有人可以帮帮我吗?
顺便说一句,日志返回一个布尔值。
const RateLimiter = require('limiter').RateLimiter;
const limiter = new RateLimiter(50, 5000)
for (let i = 0; i < arrayOfOrders.length; i++) {
const response = limiter.removeTokens(1, async (err, remainingRequests) => {
console.log('request')
return await CoreServices.load('updateOrder', {
"OrderNumber": arrayOfOrders[i],
"WorkFlowID": status
})
})
console.log('response', response)
}
console.log('needs to log after all the request');
这是登录:
response true
response true
response false
needs to log after all the request
request
request
request
...
【问题讨论】:
-
在您的情况下,
.map()将返回一组承诺。如果你想等待所有这些都完成,那么你需要做await Promise.all(arrayOfOrders.map(...))。或者,如果您可以对它们进行排序,请将.map()更改为常规的for循环,然后循环内的await实际上会做一些有用的事情。请记住,.map()不是承诺或await知道所以return await Coreservices.load(...)不会等待任何东西。它只是向.map()返回一个承诺。 -
这不是问题,使用它也不起作用。它仍然没有等待所有请求完成才能继续。我相信这是限制器。
-
用@jfriend00 的想法更新了代码
-
我不知道
limiter.removeTokens()应该做什么,但如果你混合使用承诺和常规回调,你注定要控制流程。你无法控制它。我猜你可以承诺limiter.removeTokens()然后await这个结果。 -
检查答案 - 我认为它会满足您的需求
标签: javascript node.js async-await rate-limiting