NgRx достигает полезной нагрузки действия внутри функции flatMap - PullRequest
1 голос
/ 09 января 2020

Я относительно новичок в NgRx, я использую его всего несколько месяцев, и есть эта проблема, с которой я боролся уже несколько дней, и никогда не нашел ничего полезного в документации по этому поводу.

Я также использую Angular 8 с NgRx 8. Это мой довольно простой, фиктивный код.

действие getItems

export interface GetItems {
  param: number;
}

export const getItems = createAction("[App] Get items", props<GetItems>());

эффект getItems:

getItems$ = createEffect(
() =>
  this.actions$.pipe(
    ofType(AppActions.getItems),
    tap((action) => console.log(action.param),
    exhaustMap(action => this.appService.getItems()),
    map((response: Item[]) => {
      console.log(action.param);

      return this.store.dispatch(
        AppActions.getItemsComplete({ items: response })
      );
    })
  ),
  { dispatch: false }
);

Отправка действия getItems:

ngOnInit(): void {
  const param: number = 99;

  this.store.dispatch(getItems({ param }));
}

Есть ли способ получить параметр действия полезную нагрузку внутри оператора выхлопной карты? Как вы можете видеть здесь, второй console.log выдаст ошибку об объекте пропущенных действий. Моя цель: сначала отправить запрос в appService (без параметра действия getItems ), а затем отправить действие getItemsComplete С getItems параметр действия.

1 Ответ

0 голосов
/ 09 января 2020

Один из подходов будет следующим:

getItems$ = createEffect(
() =>
  this.actions$.pipe(
    ofType(AppActions.getItems),
    tap((action) => console.log(action.param),
    exhaustMap(action => forkJoin(of(action), this.appService.getItems())),
    map(([action, response]) => {
      console.log(action.param);

      return this.store.dispatch(
        AppActions.getItemsComplete({ items: response })
      );
    })
  ),
  { dispatch: false }
);

forkJoin обеспечит завершение обеих наблюдаемых, а затем делегирует массив ответов дальше по трубе. Вы можете передать N наблюдаемых в forkJoin, но вы получите ответ массива один раз все завершено .

...