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

时间:2018-04-11 12:05:03

标签: typescript functional-programming rxjs observable

是否有更优雅的方式来执行以下操作?

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)))
    );
}

如何更好地流利地记住this.appInfo.getVersion()this.storage.get('access_token')的两个返回值,而不将它们写入具有rxjs功能的临时变量?

也许将一些观察结果合并为一个? 有很多rxjs运算符和东西......

3 个答案:

答案 0 :(得分:5)

使用forkJoin

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

但使用withLatestFrom更容易:

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

我之所以包括两者,是因为withLatestFrom更容易,但是在需要访问初始参数的地方应使用forkJoin。例如,如果您正在做this.storage.get(appVersion)

答案 1 :(得分:4)

使用forkJoin,它是针对此类情况而设计的。

答案 2 :(得分:3)

你可能想尝试这样的事情

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))
    );
}

带邮政编辑的替代版

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]))
    );
}
相关问题