Я использую 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