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

如何使用tap和observable

  •  -1
  • RandomUs1r  · 技术社区  · 6 年前

    我使用flatMap获取用户详细信息,还需要获取用户图像字节流:

    this.authStore.jwtContainer$.pipe(
        tap(j => {
            foo = this.userService.getUserImageDataUrl(j.userImageObjectKey).subscribe(i => foo = i);
            console.log(j);
        }),
        flatMap(x => this.userService.getUserById(x.userLoginId)))
        .subscribe(z => this.user = z);
    

    这段代码可以工作,但我似乎遇到了双重订阅的情况,有没有办法让这两个调用都基于jwtContainer订阅异步启动?

    1 回复  |  直到 6 年前
        1
  •  1
  •   CozyAzure    6 年前

    对你可以用 forkJoin 要组合所有可观察对象并并行激发它们,请执行以下操作:

    this.authStore.jwtContainer$.pipe(
        flatMap(x =>
            forkJoin([
                this.userService.getUserImageDataUrl(x.userImageObjectKey),
                this.userService.getUserById(x.userLoginId)])))
        .subscribe(([image,user]) => this.user = user);
    

    注意 在arrray中发出最终聚合结果之前,必须等待其所有观测值完成。