Как создать или удалить несколько данных вместе с ngrx? - PullRequest
1 голос
/ 24 апреля 2020

В сочетании со всеми «потоковыми архитектурами» (actions, effects, reducers et c ...) и rxjs Я пытаюсь создать и или удалить несколько данных .

И у меня возникли следующие проблемы:

  1. Как создать или удалить несколько данных как в бэкэнде, так и в сущности в штате?
  2. Я исследовал, и люди говорили, что используют forkJoin, но как это используется с архитектурой Flux?
  3. Как получать эти данные в реальном времени и делать другие запросы ждать их прибытия?

Вот пример того, что я делаю:

ОБРАТНАЯ СВЯЗЬ:

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()));
                }
            });
        }
    });
}

1 Ответ

0 голосов
/ 07 мая 2020

Вы делаете это почти правильно

create(people: Array<IPeople>): Observable<Array<IPeople>> {
  return forkJoin(
    ...people.map(person => this.httpClient.post<IPeople>(this.endpoint, person)),
  );
}

Также fromPeopleAction.DELETE_SUCCESS и addMany звучат странно вместе. Я бы добавил для него независимый on.

, теперь создание вызовет запросы на создание.

Как создать или удалить несколько данных как в бэкэнде, так и в сущностях в штат?

  • как у тебя все хорошо.

Я исследовал, и люди говорили, что используют forkJoin, но как это использовать? с архитектурой потока?

  • проверьте мой пример выше

Как получить эти данные в режиме реального времени и заставить другие запросы ждать их прибытия?

  • лучше было бы иметь один запрос для извлечения всех данных, а затем преобразовать ответ на множество действий, таких как ADD_MANY et c. Или использовать forkJoin, если ваш бэкэнд не предоставляет единых конечных точек для массового обмена данными.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...