Home > Net >  How do I limit fetch calls made to an endpoint service so that no more than 10 calls per second are
How do I limit fetch calls made to an endpoint service so that no more than 10 calls per second are

Time:05-09

In order to avoid the "Error 429 Too Many Requests" error in browser, how can I modify the below code so that no more than 10 calls per second are made?

This 10 calls per second rate limit is imposed by a 3rd-party API, over which we have no control.

Thanks in advance!

// Array of hundreds of URLS
const urls = allNames.map(
        (name) =>
`https://example.com/api/v3/results/${name}?limit=120&apikey=123`
    );

// TODO add throttle so as to not exceed 10 calls per second
const getStaticProps = async () => {
            Promise.allSettled(
            urls.map((url) =>
                fetch(url).then((resp) => resp.json())
            )
        ).then(console.log);
};

CodePudding user response:

You can fetch ten and wait for one second.

// Array of hundreds of URLS
const urlsList = allNames.map(
        (name) =>
`https://example.com/api/v3/results/${name}?limit=120&apikey=123`
    );

// TODO add throttle so as to not exceed 10 calls per second
// Fuction that returns a Promise that resolves after given Milliseconds
const timer = ms => new Promise(res => setTimeout(res, ms))

for (let i = 0; i < urlsList.length; i =10) {
  getStaticProps(urlsList.slice(i-10, i));
  await timer(1000); //It will make 10 calls and wait 1 seconds
} 

const getStaticProps = async (urls) => {
            Promise.allSettled(
            urls.map((url) =>
                fetch(url).then((resp) => resp.json())
            )
        ).then(console.log);
};

CodePudding user response:

Hopefully this helps :)

const urls = allNames.map(
  (name) => `https://example.com/api/v3/results/${name}?limit=120&apikey=123`
);

// 1s === 1000ms
const delay = async (ms) => new Promise((resolve) => setTimeout(resolve, ms));

const isEven = (num) => num % 2 === 0;

const getStaticProps = async () => {
  const response = await Promise.allSettled(
    urls.map(async (url, index) => {
      if (index && isEven(index / 5)) await delay(1000);
      return await fetch(url).then((res) => res.json());
    })
  );
};
  • Related