【发布时间】:2021-02-28 02:02:14
【问题描述】:
我正在仅客户端环境中编写 Javascript,调用速率受限的服务的 API。我的环境只允许我使用 LazyLoad.js 加载 JS 库,这并不适用于所有事情。我已经成功地能够使用节流队列来限制我的 API 请求。但是我无法将它与利用 Promise.all 结合起来检查一系列 API 调用何时完成。如果我省略节流,它会起作用,但不会。
如何将这两者结合起来?到目前为止,我想出的唯一方法似乎很笨拙,是使用 setTimeout 为每个调用手动限制速率。然后我发现在检查 Promises.all 之前我需要等待总时间(例如每次调用 200 毫秒),否则前几个 Promises 解决得太快了。这是我所拥有的:
var deferreds = [];
$.each(evalTempQuestions, function(idx, evalTempQuestion){
setTimeout(function(){
deferreds.push(knackAPI('POST', 116, 75, evalTempQuestion.payload));
}, 200 * idx);
});
setTimeout(function(){
Promise.all(deferreds).then(function(r) {
console.log('done');
}).catch(function(err){
console.log(err);
});
}, 200 * evalTempQuestions.length);
我怎样才能做得更好?
【问题讨论】:
-
不要异步推送延迟,而是立即推送您将异步解决的延迟。
-
您可以在此答案中查看
rateLimitMap()函数:Choose proper async method for batch processing for max requests/sec。它可以让您指定每秒请求的数量和飞行中请求的最大数量,然后在发送请求时进行管理。 -
@bergi 谢谢,这听起来是个好主意 - 你能解释一下我将如何修改代码来做到这一点吗?
标签: javascript promise throttling