В сочетании со всеми «потоковыми архитектурами» (actions
, effects
, reducers
et c ...) и rxjs
Я пытаюсь создать и или удалить несколько данных .
И у меня возникли следующие проблемы:
- Как создать или удалить несколько данных как в бэкэнде, так и в сущности в штате?
- Я исследовал, и люди говорили, что используют forkJoin, но как это используется с архитектурой Flux?
- Как получать эти данные в реальном времени и делать другие запросы ждать их прибытия?
Вот пример того, что я делаю:
ОБРАТНАЯ СВЯЗЬ:
create(peoples: Array<IPeople>): Observable<Array<IPeople>> {
const https = [];
peoples.forEach((people) => https.push(this.httpClient.post<IPeople>(this.endpoint, people)));
return forkJoin([]);
}
ЭФФЕКТЫ
createAll$ = createEffect(() =>
this.action$.pipe(
ofType(fromPeopleActions.CREATE),
mergeMap((action) => {
return this.backend.create(action.people).pipe(
map((people) => fromPeopleActions.CREATE_SUCCESS({ people })),
catchError((error) => of(fromPeopleActions.CREATE_FAIL({ error: this.requestHandler.getError(error) })))
);
})
)
);
РЕДУКТОР:
const peopleReducer = createReducer(
INIT_STATE,
on(fromPeopleAction.GET_ALL_SUCCESS, fromPeopleAction.CREATE_SUCCESS, fromPeopleAction.DELETE_SUCCESS, (state, { peoples }) => adapter.addMany(peoples, { ...state, loading: false })),
on(fromPeopleAction.GET_ALL_FAIL, fromPeopleAction.CREATE_FAIL, fromPeopleAction.DELETE_FAIL, (state, { error }) => ({ ...state, error, loading: false }))
);
ВЫЗОВ
ngOnInit(): void {
this.peopleDispatchService.getAll();
this.peopleSelectorsService.loading.subscribe((isLoading) => {
if (!isLoading) {
this.peopleSelectorsService.total.subscribe((total) => {
console.log(total);
if (total === 0) {
this.peopleDispatchService.create([
{ id: '0', isMain: true, name: 'THIAGO DE BONIS CARVALHO SAAD SAUD', avatar: 'assets/users/thiagobonis.jpg', messages: null },
{ id: '1', isMain: false, name: 'BILL GATES', avatar: 'assets/users/billgates.jpg', messages: null },
{ id: '2', isMain: false, name: 'STEVE JOBS', avatar: 'assets/users/stevejobs.jpg', messages: null },
{ id: '3', isMain: false, name: 'LINUS TORVALDS', avatar: 'assets/users/linustorvalds.jpg', messages: null },
{ id: '4', isMain: false, name: 'EDSGER DIJKSTRA', avatar: 'assets/users/dijkstra.jpg', messages: null },
])
} else {
this.peopleSelectorsService.allIds.subscribe((ids) => this.peopleDispatchService.delete(ids.toString()));
}
});
}
});
}