如何从嵌套的rxjs运算符返回多个操作

时间:2019-10-21 20:32:18

标签: angular rxjs ngrx

我在分派多个动作时遇到以下效果:

    @Effect()
    someEffect$ = this.actions$.pipe(
      ofType(someAction: Actions),
      mergeMap(
        (action)=>{
          return this.authService.getProfile(action.payload.authInfo).pipe(
              map((response: any) => {

                  if (response.isErrorResponse) {
                    return new HeaderActions.AuthFail(response);
                  } else {

                 //here i'd like to return multiple actions
                    return [
                      new HeaderActions.FetchMPInfoSuccess(this.fetchMpInfoSuccesState(getMpProfileResponse)),
                      new HeaderActions.GetAccountStates(true)
                  ]
                  }
              }),
              catchError((error:HttpErrorResponse )=>{
                return of(new HeaderActions.AuthFail(response));
              })
            );
        }
      )
    );

我尝试在return块中添加一系列动作,但这会导致错误,即我未发送有效动作,知道我在做什么错吗?

2 个答案:

答案 0 :(得分:3)

您可以使用 switchMap 代替 mergeMap 。 然后使用 flatMap switchMap 代替 map

代码应如下所示:

@Effect()
someEffect$ = this.actions$.pipe(
  ofType(someAction: Actions),
  switchMap(
    (action)=>{
      return this.authService.getProfile(action.payload.authInfo).pipe(
          flatMap((response: any) => {

              if (response.isErrorResponse) {
                return new HeaderActions.AuthFail(response);
              } else {

             //here i'd like to return multiple actions
                return [
                  new HeaderActions.FetchMPInfoSuccess(this.fetchMpInfoSuccesState(getMpProfileResponse)),
                  new HeaderActions.GetAccountStates(true)
              ]
              }
          }),
          catchError((error:HttpErrorResponse )=>{
            return of(new HeaderActions.AuthFail(response));
          })
        );
    }
  )
);

要访问子组件中的数据,可以将这种方法与@Input()集合一起使用:

@Input() set(data: any) {
if (data) { console.log(data) }}

html中的数据将始终存在。

地图修改由源Observable发出的每个项目,并发出修改后的项目。

FlatMap SwitchMap 还在每个发射的项目上应用了一个函数,但是它不返回修改后的项目,而是返回可以再次发射数据的Observable本身。

FlatMap 合并多个Observable发出的项目,并返回一个Observable。

SwitchMap 与FlatMap有点不同。每当新项目开始发射时,SwitchMap就会从先前的源Observable退订,因此总是从当前Observable发射项目。

如果您想进一步了解rxjs运算符,请查看here

答案 1 :(得分:-1)

尝试:


@Effect()
    someEffect$ = this.actions$.pipe(
      ofType(someAction: Actions),
      switchMap(
        (action)=>{
          return this.authService.getProfile(action.payload.authInfo).pipe(
              map((response: any) => {

                  if (response.isErrorResponse) {
                    return [new HeaderActions.AuthFail(response)];
                  } else {

                 //here i'd like to return multiple actions
                    return [
                      new HeaderActions.FetchMPInfoSuccess(this.fetchMpInfoSuccesState(getMpProfileResponse)),
                      new HeaderActions.GetAccountStates(true)
                  ]
                  }
              }),
              catchError((error:HttpErrorResponse )=>{
                return of(new HeaderActions.AuthFail(response));
              })
            );
        }
      )
    );

所以基本上我所做的是,不是在服务调用之前使用mergeMap,而是将其交换回简单的switchMap

为什么我从mergeMap更改它的原因是:您仅从单个流中返回值。