angular - NGRX-effekt udsendte en ugyldig handling


Jeg prøver at oprette en @Effect() for min handling. Når jeg kører handling med typen AuthenticationUserLoad, får jeg en fejl.

ERROR Error: Effect "AuthenticationEffects.getUser$" dispatched an invalid action: [object Object]

Her er min Effect kode

    @Effect()
      getUser$ = this.actions$.pipe(
       ofType(AuthenticationUserActions.AuthenticationUserTypes.AuthenticationUserLoad),
       map((action) => {

          return this.authService.getUser().pipe(
            map((user: User) => new AuthenticationUserActions.AuthenticationUserLoadSuccess({user})),
            catchError(error => of(new AuthenticationUserActions.AuthenticationUserLoadFailure({error})))

          );
        })
     );

OPDATERING

Jeg ændrede map til switchMap, og det virker.

 @Effect()
  getUser$ = this.actions$.pipe(
    ofType(AuthenticationUserActions.AuthenticationUserTypes.AuthenticationUserLoad),
    switchMap((action) => {

      return this.authService.getUser().pipe(
        map((user: User) => new AuthenticationUserActions.AuthenticationUserLoadSuccess({user})),
        catchError(error => of(new AuthenticationUserActions.AuthenticationUserLoadFailure({error})))
      );
    })
  );

Måske forstår jeg ikke forskellen mellem map og switchMap.

Svar #1

map-operatoren mapper den aktuelle værdi, den bekymrer sig ikke om, hvorvidt det er et observable eller ej. Mens switchMap eller mergeMap eller concatMap forventer, at en callback returnerer en observable værdi, abonnerer på den og udsender dens værdier.

Derfor, når du kalder map, siger du, at den nuværende værdi skal omdannes til noget andet.

map(action => return this.authService.getUser()),
// here the value is an observable stream, but not its emits.

når du kalder switchMap siger du nu, at jeg vil abonnere på en anden strøm og udsende dens værdier. Fordi det er switchMap siger det også, at når den overordnede strøm udsender (den samme handling kommer), skal du afmelde den nuværende underordnede strøm og abonnere igen på, hvad et nyt kald af this.authService.getUser() returnerer.

switchMap(action => return this.authService.getUser()),
// here the value is an emit from this.authService.getUser() stream.

Svar #2

I mit tilfælde løste det problemet at tilføje { dispatch: false } i handlingsopkaldet.

getUser$ = createEffect(() => 
    this.actions$.pipe(
        ofType(actionName),
        withLatestFrom(this.store.select('app')),
        switchMap(() => {
            ...
        })
    ), { dispatch: false }
)

Relaterede artikler