关于javascript:处理25,000个对API的GET请求

Handling 25,000 GET requests to an API

因此,基本上,我正在尝试向API发送大量(约25,000个)GET请求。我将axios用作进行HTTP调用的库。

所以我有:

1
dsHistPromises.push(axios.get(url))

然后我正在使用:

1
2
3
4
5
6
7
8
9
10
11
axios.all(dsHistPromises)
    .then(function(results) {
      results.forEach(function(response){
        if (format === lists.formats.highlow) {
          storage.darkskyHistoryHighLow.push(requests.parseDarkskyHighLow(response, city))
        }
        // parse data here and print it to files...
      })
    }).catch(err => {
      throw err
    })

履行我的所有诺言。

当我尝试运行代码时,出现类似

的错误

1
(node:10400) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: read ECONNRESET

我必须想象这是我连接的API的问题。服务器可能很难管理我的请求,对吗?

有什么技巧可以解决这个问题吗?


您怀疑,这是因为您正在访问的API。大多数理智的API都会采取某种限制措施,以防止一个用户将其降低。您可能会遇到这种情况。

您需要做的是通过在两次通话之间设置时间延迟来限制您的消息。

有两种方法可以解决此问题。一种方法是依次进行每个呼叫。这将有助于避免服务器节流,但速度可能会变慢。

如果服务器允许,则可以并行执行多个请求。

基本上,它看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const urls = getUrlsToCallFromSomewhere();
const delay = 500; // ms

const next = () => {
  if (!urls.length) {
    return;
  }

  const url = urls.pop();
  axios.get(url).then(data => {
    results.push(data);
    const now = Date.now();

    if (now - start > delay) {
      next();
    } else {
      setTimeout(next, delay - (now - start));
    }
  });
};

这不是超级完美,但应该可以给您一个想法。基本上,一次叫他们一个。完成后,请检查已完成多长时间。如果您已经达到delay金额,请立即调用。如果不是,请使用setTimeout()等待时间。

您可以安排代码以同时运行其中的一些代码,以加快处理速度,并根据需要将延迟调整为尽可能长或尽可能快。