将多个参数传递给rxjs运算符

ulo*_*oco 8 functional-programming observable rxjs typescript

有更优雅的方式做以下事情吗?

private getHeaders(): Observable<any> {
  let version;
  let token;
  return this.appInfo.getVersion()
    .pipe(
      tap(appVersion => version = appVersion),
      mergeMap(() => this.storage.get('access_token')),
      tap(accessToken => token = accessToken),
      mergeMap(accessToken => of(this.createHeaders(version, token)))
    );
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能更流畅地记住两个返回值,this.appInfo.getVersion()this.storage.get('access_token')不是用rxjs的强大功能将它们写入临时变量?

也许将一些可观测量合并为一个?rxjs有很多运算符和东西......

dan*_*y74 8

使用forkJoin:

.pipe(
  mergeMap((appVersion) => forkJoin(
    of(appVersion),
    this.storage.get('access_token').take(1)
  )),
  mergeMap(([version, token]) => {
    this.createHeaders(version, token)
  })
)
Run Code Online (Sandbox Code Playgroud)

但更容易withLatestFrom:

.pipe(
  withLatestFrom(this.storage.get('access_token')),
  mergeMap(([version, token]) => {
    this.createHeaders(version, token)
  })
)
Run Code Online (Sandbox Code Playgroud)

我已将两者都包括在内因为withLatestFrom更容易,但forkJoin应该在需要访问初始参数的地方使用.例如,如果你在做this.storage.get(appVersion)

  • forkJoin 并未被弃用,它现在只需要一个数组而不是逗号分隔的参数 - 旧的逗号分隔的参数方法已被弃用 (2认同)

Pic*_*cci 6

你可能想尝试这样的事情

private getHeaders(): Observable<any> {
  return this.appInfo.getVersion()
    .pipe(
      mergeMap(version => this.storage.get('access_token')
                          .map(token => ({version, token})),
      map(data => this.createHeaders(data.version, data.token))
    );
}
Run Code Online (Sandbox Code Playgroud)

带 ZIP 的替代版本

private getHeaders(): Observable<any> {
  const versionObs = this.appInfo.getVersion();
  const tokenObs = this.storage.get('access_token');
  return Observable.zip(versionObs, tokenObs)
    .pipe(
      map(data => this.createHeaders(data[0], data[1]))
    );
}
Run Code Online (Sandbox Code Playgroud)


小智 6

使用forkJoin,它是针对这种情况而设计的。