代码之家  ›  专栏  ›  技术社区  ›  uloco

将多个参数传递给rxjs操作符

  •  13
  • uloco  · 技术社区  · 8 年前

    有没有一种更优雅的方法可以做到以下几点?

    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 回复  |  直到 8 年前
        1
  •  14
  •   danday74    7 年前

    使用 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 更容易,但 分叉连接 应在需要访问初始参数的位置使用。例如,如果您正在 this.storage.get(appVersion)

        2
  •  6
  •   LordAlpaca    8 年前

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

        3
  •  5
  •   Picci    8 年前

    你可以试试这样的

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

    带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]))
        );
    }
    
    推荐文章