Объединение операторов карты RxJS и эффектов ngrx

В моем приложении используются эффекты ngrx и ngrx. Вот один из эффектов моего приложения:

  @Effect()
  reloadPersonalInfo$: Observable<Action> = this.actions$
    .ofType(currentUserAccount.ActionTypes.RELOAD_PERSONAL_INFO)
    .filter(() => <boolean>JSON.parse(localStorage.getItem('authenticated')))
    .switchMap(() =>
      this.userAccountService
        .retrieveCurrentUserAccount()
        .map(currentUserAccount => new LoadUserAccountAction(currentUserAccount))
        .map(() => new SigninAction())
    );

Мне интересно, почему LoadUserAccountAction не входит в мою функцию редуктора, кроме как если я закомментирую //.map(() => new SigninAction())

Кто-нибудь может помочь? Что я делаю неправильно?


person balteo    schedule 02.03.2017    source источник
comment
Эффекты предназначены для возврата только одного действия.   -  person Jim    schedule 07.03.2017
comment
@Jim: Спасибо за ваш комментарий и редактирование. Не могли бы вы предложить способ изменить дизайн приложения, чтобы избежать возврата нескольких действий из действия?   -  person balteo    schedule 25.03.2017
comment
Вы пытаетесь вернуть как LoadUserAccountAction, так и SigninAction в одном эффекте. Вы должны вернуть одно из другого. Другими словами, удалите одну из ваших строк .map в коде.   -  person Jim    schedule 25.03.2017
comment
Я имел в виду ответ Картанта. Относится ли ваш комментарий о возврате только одного действия к возврату нескольких действий, объединенных с помощью concatMap (см. ответ ниже)?   -  person balteo    schedule 25.03.2017


Ответы (1)


Ваш LoadUserAccountAction не отправляется, потому что он не испускается эффектом, так как окончательный .map(() => new SigninAction()) вместо этого видит испускаемый SigninAction.

Эффект может вызвать несколько действий, вам просто нужно сделать это следующим образом:

@Effect()
reloadPersonalInfo$: Observable<Action> = this.actions$
  .ofType(currentUserAccount.ActionTypes.RELOAD_PERSONAL_INFO)
  .filter(() => <boolean>JSON.parse(localStorage.getItem('authenticated')))
  .switchMap(() => this.userAccountService
    .retrieveCurrentUserAccount()
    .concatMap(currentUserAccount => [
      new LoadUserAccountAction(currentUserAccount),
      new SigninAction()
    ])
  );

Оператор concatMap выравнивает массив, содержащий два действия, так что оба действия выдаются в том порядке, в котором они объявлены в массиве.

person cartant    schedule 02.03.2017