Эффекты ngrx: отправление пустого действия - PullRequest
0 голосов
/ 13 июня 2018

Как получить эффект ngrx / store для отправки пустого действия?Я использую Angular 6 / rxjs 6:

  @Effect()
  testEffect$ = this.actions$.ofType(FIRST_ACTION).pipe(
    map((x) => {
       if (x === y) {
          return new SECOND_ACTION;
       } else {
          fire.some.effect;
          return EMPTY;
       }
    })
  );

В настоящий момент я получаю две ошибки: Effect "testEffect$" dispatched an invalid action: [object Object], за которыми следует TypeError: Actions must have a type property.

Я нашел этот ответ , но он не работает с ng / rxjs 6. До сих пор я пробовал следующее (ничего не работает):

EMPTY, Observable.empty(), Observable.of() и Observable.of([]), { type: 'EMPTY_ACTION' }

Любая помощь будет оценена!Я знаю, что могу использовать { dispatch: false }, но фактический эффект имеет около пяти результатов, и только один из них не использует действие, поэтому я предпочел бы, чтобы последний тоже что-то возвращал.

Ответы [ 3 ]

0 голосов
/ 21 июня 2018

Вот возможное решение:

@Effect()
  testEffect$ = this.actions$.ofType(FIRST_ACTION).pipe(
    tap((x) => { // do some side effect here
        if (x !== y ) {
            fire.some.effect;
        }
    }),
    filter((x) => x === y), // proceed only if condition is true
    map((x) => {
       return new SECOND_ACTION; // then return the needed action
    })
  );
0 голосов
/ 04 декабря 2018

вы можете просто использовать фильтр

@Effect()
testEffect$ = this.actions$.ofType(FIRST_ACTION).pipe(
  filter(x => x === y),
  map( x => new SECOND_ACTION)
)

, и если вам все еще нужен другой случай, вы можете написать другой эффект с помощью dispatch: false

0 голосов
/ 13 июня 2018

Это работает для меня (нг6):

@Effect()
boardOpened$ = this.actions$
  .ofType<BoardActions.Open>(BoardActions.OPEN)
  .pipe(
    withLatestFrom(this.store.select(BoardSelectors.getState)),
    map(([action, state]: [Action, BoardReducer.State]) => {
      return !BoardReducer.isLoaded(state)
        ? new BoardActions.Load()
        : EMPTY;
    })
  );

или

@Effect()
boardOpened$ = this.actions$
  .ofType<BoardActions.Open>(BoardActions.OPEN)
  .pipe(
    withLatestFrom(this.store.select(BoardSelectors.getState)),
    switchMap(([action, state]: [Action, BoardReducer.State]) => {
      return !BoardReducer.isLoaded(state)
        ? of(new BoardActions.Load())
        : EMPTY;
    })
  );
...