[英]NodeJS: best practice get result of sample url for users and admins
[英]Best practice for sequential url requests nodejs
我有一个需要从API请求的网址列表,但是为了避免造成大量负载,我理想情况下希望以x秒的间隔执行这些请求。 一旦所有请求完成,就会遵循某些无关紧要的逻辑。
有很多方法可以解决,我已经实施了几个。
A)使用递归函数,该递归函数遍历包含所有URL的数组,并在完成每个请求且发生超时时调用自身
B)为循环中的每个请求设置超时,并增加延迟,并返回Promise.promise.promise解析后的所有内容,依此类推。
这些都有效 。 但是,您会说这是推荐的方法吗? 这更多是一种学术性的问题,因为这样做是为了学习,所以我宁愿避免使用抽象果汁的库。
您的解决方案几乎完全相同。 以为我会选择一种不同的方法。 我将做出最初的承诺和睡眠承诺功能,然后将它们链接在一起。
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))
})
最后,了解您所了解的内容,最有意义的内容以及本月您将了解的内容。 您最能读懂的一个是您首选的解决方案,此处的性能无关紧要。
您可以使用类似的方法来限制每个周期。
如果您希望即使在某些网址失败的情况下也能处理所有网址,则可以捕获失败的网址并从结果中挑选出来。
代码如下所示:
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);
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.