Зависимая цепочка наблюдаемых - PullRequest
0 голосов
/ 14 сентября 2018

Я использую ngrx / store и ngrx / Effects для управления глобальным состоянием внутри моего углового приложения. Поскольку у нас есть фиксированный API, мне пришлось реализовать некоторую логику в моем клиентском приложении. API имеет конечные точки для создания новых записей и добавления к ним вложений. Клиент должен поддерживать создание и добавление произвольного количества вложений одновременно. Поскольку API управляет историей каждой записи (в основном списком записей), он генерирует новый идентификатор после добавления каждого вложения.

По сути, я хочу объединить запросы к API для добавления вложений. Поскольку количество запросов является произвольным и каждая наблюдаемая зависит от ответа предыдущего, это не простая задача.

Пока мне удалось связать два запроса (просто пример с ОДНЫМ запросом для всех файлов)

  @Effect()
  create$: Observable<Action> = this.actions$.pipe<ActionWithPayload>(
    ofType(CREATE_ENTRY_START),
    concatMap(action => {
        return this.defaultService.create(action.payload.entry).pipe(
          map(response =>
            !action.payload.files || action.payload.files.length === 0 ?
              createEntrySuccess()
              : createAttachmentsStart(response.id, action.payload.files)
          ),
          catchError(() => {
            return of(createEntryError());
          })
        );
      }
    ),
    ofType(CREATE_ATTACHMENTS_START),
    concatMap(action => {
        return this.defaultService.addAttachment(action.payload.id, action.payload.files).pipe(
          map(response => createEntrySuccess()),
          catchError(() => of(createEntryError()))
        );
      }
    )
  );

Но теперь я хочу связать n-раз из (динамически генерируемых):

concatMap(action => {
    return this.defaultService.addAttachment(action.payload.id, action.payload.files).pipe(
      map(response => createEntrySuccess()),
      catchError(() => of(createEntryError()))
    );
  }
)

Поскольку для каждого запроса требуется ответный идентификатор предыдущего запроса addAttachment для API, я зависим от предыдущего наблюдателя.

Я не уверен, есть ли оператор для этого варианта использования. Я поиграл с повторением, но действие, которое «входит» в addAttachment, всегда то же самое, а не новое, которое я запускаю после завершения.

Спасибо Tobias

...