Уроки53. Project: parallel uploads with concurrency
Уроки · 53
53. Project: parallel uploads with concurrency
Проект 5 — параллельность с ограничением
Загрузка файлов: 100 файлов и 100 параллельных запросов положат браузер, а строго по одному будет очень долго. Нужен компромисс: например, 2 одновременно. У mergeMap есть секретный второй аргумент — concurrency.
from(files).pipe(
mergeMap(file => uploadFile(file), 2)
)
// в любой момент работает максимум 2 загрузки
Как читать ожидаемый порядок
Файлы: A (60мс), B (20мс), C (10мс), D (5мс). Concurrency=2 значит: стартуют A и B. B заканчивается через 20мс — стартует C. Через 30мс заканчивается C — стартует D. Через 35мс D готов. A всё ещё крутится 60мс и заканчивается последним. Порядок выхода: B, C, D, A.
Что нужно сделать
- В
uploadFiles$внутриpipeдобавьтеmergeMap(file => uploadFile(file), 2). - Цифра
2— это и есть concurrency.
Детерминированная проверка
В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.
Решение spoiler · click to reveal
const { from, mergeMap } = Rx;
function uploadFiles$(files, uploadFile) {
return from(files).pipe(
mergeMap(file => uploadFile(file), 2)
);
} script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...