0

アプリケーションの ngrx 効果の 1 つに問題があります。私は基本的に、ルーターストアの を使用してconcatMap() ANDgo()ナビゲートを使用して複数のアクションを実行しようとしています。

効果は次のとおりです。

  @Effect()
  loadPersonalInfoAndSignin$: Observable<Action> = this.actions$
    .ofType(session.ActionTypes.LOAD_PERSONAL_INFO)
    .map((action: LoadPersonalInfoAction) => action.payload)
    .do(sessionToken => {
      localStorage.setItem('authenticated', 'true');
      localStorage.setItem('sessionToken', sessionToken);
    })
    .switchMap(() => this.userAccountService
      .retrieveCurrentUserAccount()
      .concatMap(currentUserAccount => [
        new LoadUserAccountAction(currentUserAccount),
        new SigninAction(),
        new LoadMessagesAction({})
      ])
    )
    .mapTo(go(['/dashboard']));

を削除すると、配列.mapTo(go(['/dashboard']))内の 3 つのアクションすべてが対応する効果に正常にディスパッチされます。concatMap

したがって、なぜ mymapTo(go(...が配列内の最後の 2 つのアクション (つまりSigninAction& LoadMessagesAction) を対応するエフェクトにディスパッチしないのか疑問に思っています..

誰か助けてくれませんか?

編集:次のようmapToに変更:do

.do(go(['/dashboard']));

次のエラーが発生します。

ERROR in /Users/julien/Documents/projects/bignibou/bignibou-client/src/app/core/store/session/session.effects.ts (55,9): Argument of type 'Action' is not assignable to parameter of type 'PartialObserver<SigninAction>'.
  Type 'Action' is not assignable to type 'CompletionObserver<SigninAction>'.
    Property 'complete' is missing in type 'Action'.
4

1 に答える 1

1

通話に使用doしてもgo、ルートは変更されません。goはアクション クリエーター@ngrx/router-storeであり、それが作成するアクションは、アクションを受け取ってルート変更に影響を与えるために、エフェクトから発行される必要があります。

また、mapToオペレーターは受け取ったものを無視して、指定した値を発行するので、これも適切ではありません。

go代わりに、呼び出しによって作成されたアクションをconcatMap配列に含める必要があります。

@Effect()
loadPersonalInfoAndSignin$: Observable<Action> = this.actions$
  .ofType(session.ActionTypes.LOAD_PERSONAL_INFO)
  .map((action: LoadPersonalInfoAction) => action.payload)
  .do(sessionToken => {
    localStorage.setItem('authenticated', 'true');
    localStorage.setItem('sessionToken', sessionToken);
  })
  .switchMap(() => this.userAccountService
    .retrieveCurrentUserAccount()
    .concatMap(currentUserAccount => [
      new LoadUserAccountAction(currentUserAccount),
      new SigninAction(),
      new LoadMessagesAction({}),
      go(['/dashboard'])
    ])
  );
于 2017-03-26T12:41:29.757 に答える