Как можно кратко подсчитать, сколько запросов было отправлено? - PullRequest
0 голосов
/ 29 мая 2020

Мне интересно, как кратко подсчитать количество отправленных запросов. Существует API, который позволяет отправлять максимум 50 запросов в минуту на любую конечную точку этого API. Каждые 60 секунд они снова сбрасывают количество отправленных мной запросов на ноль после отправки первого запроса. Мне нужно сделать много запросов, и мне интересно, как я могу правильно их отслеживать.

async dataCollector(){
    let urlList = this.urlList; // 100+ urls
    for(let url in urlList){
      await this.getResource(url).then( data =>
        // do something with data
      )
}

Теперь мне нужно как-то проверить getResource(), сколько запросов я отправил и так далее, чтобы Я просто жду, пока поступят новые запросы. Как лучше всего их проверить?

getResource(url){
    return this.http.get(url);
}

Я ценю любой совет.

1 Ответ

1 голос
/ 29 мая 2020

Вы можете вести подсчет отправленных запросов и время первого запроса. Вам также нужен способ ожидания предыдущих запросов, который может быть выполнен с помощью цепочки обещаний:

 chain = Promise.resolve();
 count = 0;
 first = undefined;

 aquireSlot() {
    return this.chain = this.chain.then(async () => {
       if(this.count >= 20) {
         await timer(60_000 - (Date.now() - this.first));
         this.count = 0;
         this.first = undefined;
       }
       if(!this.first) this.first = Date.now();
       this.count += 1;
    });
 }

 async getResource(url){
   await this.aquireSlot();
   return await this.http.get(url);
 }

  // the implementation of timer is left to the reader

С помощью этого кода каждый тип вызова getResource заканчивается в очереди (цепочка обещаний) . Если в очереди меньше 20 элементов, цепочка просто продолжается, и вызовы выполняются. Если элементов 20, очередь приостанавливается до тех пор, пока с момента первого вызова не пройдет не менее 60 секунд. Затем счетчик сбрасывается, и все повторяется.

...