首页 文章

ngrx存储选择器无需操作即触发效果请求

提问于
浏览
1

使用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 回答

  • 2

    尝试将您的第一个 .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);
                }),
            );
          }),
      );
    

相关问题