繁体   English   中英

顺序URL请求的最佳实践Node.js

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM