@dc65k

Как реализовать задачу с заполнением очереди запросов на сервер?

Есть функция, она принимает на вход массив адресов на которые будет происходить запрос и количество параллельно выполняемых запросов. Если массив длиннее чем второй параметр, то мы должны дождаться когда можно будет делать следующие запросы.
Ниже я написал начало решения, вопрос именно в том как в коде написать очистку очереди и продолжение выполнение запросов?
const sendRequests = (requests, maxRequestsCount) => {
   
    return new Promise(resolve => {

        const responses = [];

        let requestsCount = 0;

        for (let i = 0; i < requests.length; i++) {
            const request = requests[i];

            requestsCount += 1;

            if (requestsCount !== maxRequestsCount) {
                makeRequest(request);
            }
        }

        function makeRequest(url) {
            return fetch(url)
                .then(result => result.json())
                .catch(error => error)
                .then(result => {
                    responses.push(result);
                    resolve(responses);
                });
        }
    });
}

console.log(
    sendRequests([
        'https://jsonplaceholder.typicode.com/todos/2',
        'https://jsonplaceholder.typicode.com/todos/4',
        'https://jsonplaceholder.typicode.com/todos/10',
        'https://jsonplaceholder.typicode.com/todos/18'
    ], 3).then(response => {
        console.log(response);
    })
);
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const sendRequests = (urls, max) =>
  new Promise(resolve => {
    const results = Array(urls.length).fill(null);
    let countRequests = 0;
    let countResponses = 0;

    for (let i = 0; i < Math.max(1, Math.min(max, urls.length)); i++) {
      request();
    }

    function request() {
      if (countResponses === urls.length) {
        resolve(results);
      } else if (countRequests < urls.length) {
        const index = countRequests++;
        fetch(urls[index])
          .then(result => result.json())
          .catch(error => error)
          .then(result => {
            results[index] = result;
            countResponses++;
            request();
          });
      }
    }
  });
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы