BACK
Уроки50. Project: autosave draft
Уроки · 50

50. Project: autosave draft

Проект 2 — автосохранение черновика

Похоже на typeahead, но с одним ключевым отличием: вместо switchMap здесь нужен concatMap.

Почему concatMap, а не switchMap

Для поиска старые результаты не нужны — их можно отменить. Для сохранения отменять нельзя: если данные уже ушли на сервер, отмена клиента ничего не отменит на сервере. Хуже того — если запустить два сохранения параллельно и второе закончится раньше, старый ответ может перезаписать новое состояние.

concatMap ставит сохранения в очередь: одно — после другого. Безопасно и предсказуемо.

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

  1. В createAutosave$ внутри pipe: debounceTime(20), distinctUntilChanged(), concatMap(value => saveDraft(value)).

Детерминированная проверка

В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.

Решение spoiler · click to reveal
const { debounceTime, distinctUntilChanged, concatMap } = Rx;

function createAutosave$(formValue$, saveDraft) {
  return formValue$.pipe(
    debounceTime(20),
    distinctUntilChanged(),
    concatMap(value => saveDraft(value))
  );
}
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...