Это очень сложный вопрос на собеседовании, и мне потребовалось 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 запросов, сгруппировав их, и решили проблему высокого параллелизма.
- Предоставленный вами код работоспособен и показывает…