BACK
Уроки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.

Что нужно сделать

  1. В uploadFiles$ внутри pipe добавьте mergeMap(file => uploadFile(file), 2).
  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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...