Это очень сложный вопрос на собеседовании, и мне потребовалось 2 часа, чтобы найти разумный ответ.

Это факт. Сегодня я пошел на собеседование в крупную компанию, и интервьюер задал мне следующий вопрос:

«Если запросов 10 000, как использовать промисы для управления параллелизмом?»

С 10000 запросов? он такой огромный!

Я знаю, что эти одновременные запросы к бэкэнду создадут огромную нагрузку на сервер. Если без ограничения скорости, серверная часть потенциально может выйти из строя. Тогда страницы внешнего интерфейса перестанут отвечать на запросы, что приведет к ухудшению пользовательского опыта.

Я понял, что интервьюер хотел оценить мои знания в области управления параллелизмом на основе Promise.

Подумав полчаса, я придумал следующий код.

Использование Promise.all()

const urls = ["followImdoddUrl1", "followImdoddUrl2", ... ,"followImdoddUrl10000"];
const maxConcurrentNum = 10; // Maximum concurrent requests// Split array into chunks, 'chunk' represents batch size, returns a two-dimensional array
function chunk(arr, chunk) {
  let result = [];
  for (let i = 0, len = arr.length; i < len; i += chunk) {
    result.push(arr.slice(i, i + chunk));
  }
  return result;
}

// Asynchronous request function
function fetchUrl(url) {
  return new Promise((resolve, reject) => {
    fetch(url)
      .then(res => resolve(res))
      .catch(err => reject(err));
  });
}
// Split the URL array into chunks
const chunkedUrls = chunk(urls, maxConcurrentNum);
(async function () {
  try {
    for (let urls of chunkedUrls) {
      const promises = urls.map(url => fetchUrl(url));
      // Wait for all promises to complete and store the results in the 'results' array
      const results = await Promise.allSettled(promises);
      console.log('results:', results);
    }
  } catch (err) {
    console.error(err);
  }
})();

Интервьюер кивнул после просмотра кода, похвалил мои усилия и упомянул:

  • Вы правильно справились с проблемой обработки 10000 запросов, сгруппировав их, и решили проблему высокого параллелизма.
  • Предоставленный вами код работоспособен и показывает…