@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);
    })
);
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const runTasks = (tasks, max = 1) =>
  new Promise(resolve => {
    const results = Array(tasks.length).fill(null);
    let started = 0;
    let finished = 0;

    for (let i = Math.max(1, Math.min(max, tasks.length)); i--; run()) ;

    async function run() {
      if (finished === tasks.length) {
        resolve(results);
      } else if (started < tasks.length) {
        const index = started++;

        try {
          results[index] = await tasks[index]();
        } catch (e) {
          results[index] = e;
        }

        finished++;
        run();
      }
    }
  });


const sendRequests = (urls, ...args) =>
  runTasks(urls.map(n => () => fetch(n).then(r => r.json())), ...args);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы