我有一个我需要从API请求的URL列表,但是为了避免造成大量负载,理想情况下我希望以x秒的间隔执行这些请求。一旦完成所有请求,就会产生一些无关紧要的逻辑。
有很多方法可以实现,我实施了一对。
A)使用一个遍历数组的递归函数,该数组包含所有url并在每个请求完成并且发生超时时自行调用
B)为循环中的每个请求设置超时,增量延迟并返回Promise,使用Promise.all解析后执行其余的逻辑等等。
这些都有效。但是,你会说推荐的方法是什么?这更像是一种学术性的问题,而且我这样做是为了学习,我宁愿避免使用一个抽象果汁的图书馆。
答案 0 :(得分:1)
您的解决方案几乎完全相同。以为我会选择一点不同的方法。我会做出初步的承诺和睡眠承诺功能,然后我会把它们连在一起。
function sleep(time){
return new Promise(resolve => setTimeout(resolve, ms));
}
ApiCall()
.then(sleep(1000))
.then(nextApiCall())...
或更多模块化版本
var promise = Promise.resolve()
myApiCalls.forEach(call => {
promise = promise.then(call).then(() => sleep(1000))
})
最后,按照你的理解,最让你理解的是什么以及你将在一个月内理解什么。你最好读的是你喜欢的解决方案,性能在这里无所谓。
答案 1 :(得分:0)
你可以在每个时期使用throttle之类的内容。
如果您希望处理所有网址,即使有些网址失败,您也可以抓住失败的网址,然后在结果中选择它们。
代码看起来像这样:
const Fail = function(details){this.details=details;};
twoPerSecond = throttlePeriod(2,1000);
urls = ["http://url1","http://url2",..."http://url100"];
Promise.all(//even though a 100 promises are created only 2 per second will be started
urls.map(
(url)=>
//pass fetch function to twoPerSecond, twoPerSecond will return a promise
// immediately but will not start fetch untill there is an available timeslot
twoPerSecond(fetch)(url)
.catch(e=>new Fail([e,url]))
)
)
.then(
results=>{
const failed = results.map(result=>(result&&result.constuctor)===Fail);
const succeeded = results.map(result=>(result&&result.constuctor)!==Fail);
}
)