是否可以既分派一系列动作又从 ngrx 效果导航?

Is it possible to both dispatch an array of actions and also navigate from an ngrx effect?

我的一个应用程序的 ngrx 效果有问题。我基本上是在尝试使用 concatMap() AND 执行多个操作,并使用路由器商店的 go().

进行导航

效果如下:

  @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'])),那么 concatMap 数组中的所有三个动作都会成功分派给它们相应的效果。

因此我想知道为什么我的 mapTo(go(... 导致数组中的最后两个操作(即 SigninActionLoadMessagesAction)没有被分派到它们相应的效果..

有人可以帮忙吗?

编辑:将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'.

使用 do 进行 go 调用将不会看到路由更改。 go is an action creator 并且它创建的操作需要从效果中发出,以便 @ngrx/router-store 接收操作并影响路由更改。

此外,mapTo 运算符将忽略它接收到的内容并发出您指定的值,因此也不合适。

相反,您应该在 concatMap 数组中包含 go 调用创建的操作:

@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'])
    ])
  );