Effect 在 Rxjs 6 中用两个 Observables 调用一次

Effect just call one time with two Observables in Rxjs 6

我在登录功能中有两个功能:获取盐然后登录 但是当我发送动作登录时,它只调用 1 次(一次加盐) getSalt 和 logIn 在这里是可观察的。

我的效果写对了吗?需要一些帮助,我是 rxjs 的新手,谢谢!

我的效果

  @Effect()
  logIn$: Observable<any> = this.action$
  .pipe(
    ofType<LogIn>(AuthActionTypes.LOGIN),
    map((action: LogIn) => action.payload),
    switchMap(payload => {
      return this.authService.getSalt(payload.username)
      .pipe(
        map(data => {
          return this.authService.logIn(payload, data);
        })
      );
    })
  );

我得到盐

  public getSalt(username: string): Observable<string> {
    const url = `${host}/customers/${username}/salt`;
    console.log('url salt', url);
    return this._http.get<{ salt: string }>(url)
      .pipe(
        map(res => res.salt)
      );
  }

我的登录

  public logIn({username, password}: { username: string, password: string }, salt: string) {
    /../
    return this._http.get(url, {params, headers});
  }

我想因为使用 switchMap 因为它会取消之前的发射,你可以将它更改为 concatMapmergeMap

另外,如果不在效果中调度动作,这是如何工作的?我认为这应该会引发错误,如果你不想在效果中发送一个动作(如 return),你可以 @Effect({ dispatch: false })

你映射到一个 login Observable 所以你应该使用 switchMap 而不是 map:

switchMap(payload => this.authService.getSalt(payload.username).pipe(
  switchMap(data => this.authService.logIn(payload, data))
))