Селектор магазина ngrx запускает запрос эффекта без действия - PullRequest
0 голосов
/ 24 мая 2018

Использование Angular 6 и NGRX.

Я использую селектор магазина в эффекте, чтобы получить данные для запроса.После первого раза я вызываю действие SignalAction.LOAD_SIGNAL, если в какой-то момент после этого происходит смена магазина, в результате которой селектор getRequestParams обновляется.Запрос запускается без запуска действия.

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

Я пробовал take(1) после выбора хранилища, но тогда запрос работает только один раз.

@Injectable()
export class SignalEffect {

    constructor(
        private _signalService: SignalService,
        private _actions$: Actions,
        private _store$: Store<IStore>,
    ) {}

    @Effect()
    public fetchSignal(): Observable<IAction<SignalModel[] | HttpErrorResponse>> {
        return this._actions$
            .ofType(SignalAction.LOAD_SIGNAL)
            .pipe(
                switchMap((action: IAction<void>) => this._store$.select(getRequestParams)),
                switchMap((requestParams: RequestParamsModel) => {
                    return this._signalService.getSignal(requestParams)
                        .pipe(
                            map((responseModel: SignalResponseModel | HttpErrorResponse) => {
                                if (responseModel instanceof HttpErrorResponse) {
                                    return ErrorsAction.requestFailure(responseModel);
                                }

                                return SignalAction.loadSignalSuccess(responseModel.results);
                            }),
                        );
                }),
            );
    }

}

1 Ответ

0 голосов
/ 25 мая 2018

Попробуйте переместить свой первый .pipe до ofType.

@Effect()
public fetchSignal(): Observable<IAction<SignalModel[] | HttpErrorResponse>> {
  return this._actions$
    .pipe(
      ofType(SignalAction.LOAD_SIGNAL),
      withLatestFrom(this._store$.select(getRequestParams)),
      switchMap(([action, requestParams: RequestParamsModel]) => {
        return this._signalService.getSignal(requestParams)
          .pipe(
            map((responseModel: SignalResponseModel | HttpErrorResponse) => {
              if (responseModel instanceof HttpErrorResponse) {
                return ErrorsAction.requestFailure(responseModel);
              }

              return SignalAction.loadSignalSuccess(responseModel.results);
            }),
        );
      }),
  );
...