RxJ:一个接一个地执行3个可观察对象,并使用第一个请求,第二个请求和第三个请求的结果

时间:2018-07-30 20:04:24

标签: javascript typescript dictionary rxjs observable

我需要能够一个接一个地执行3个可观察变量,以便可以使用第二个第一个结果以及第三个第一个和第二个结果。

这样的事情(因为在第三个请求中看不到serviceId,所以它不起作用):

private setupStuff(): void {
        this.initRouteParams().pipe(
            switchMap(serviceId => this.getFileInfo(serviceId)),
            switchMap(fileName => this.getExistingFile(serviceId, fileName)
                .subscribe(response => {
                    console.log(response);
                }))
            );
    }

3 个答案:

答案 0 :(得分:3)

您可以将serviceN的值显式返回给serviceN + 1。这是想法:

private setupStuff() {
  this.initRouteParams()
    .pipe(
      switchMap(serviceId => {
        return zip(of(serviceId), this.getFileInfo(serviceId))
      }),
      switchMap(([serviceId, filename]) => {
        return zip(of(serviceId), of(filename), this.getExistingFile(serviceId, filename))
      })
    )
    .subscribe(([serviceId, filename, response]) => {
      console.log(serviceId, filename, response);
    })
}

编辑:

您可以通过显式声明每个输入的类型来修复类型错误。您可能想为response分配适当的类型。

答案 1 :(得分:0)

设法解决了这个问题:

private checkFilePresence(): void {
        const first$: Observable<string> = this.initRouteParams();
        const second$: Observable<string> = first$.pipe(
            switchMap(config => {
                return this.getFileInfo(config);
            })
        );
        const third$: Observable<CkitExistingFileResponse> = combineLatest(first$, second$).pipe(
            switchMap(([config, second]) => {
                return this.getExistingFile(config, second);
            })
        );
        combineLatest(first$, third$)
            .subscribe(() => {
            });
    }

答案 2 :(得分:-1)

您可以按以下顺序订阅可观察对象:

private setupStuff(): void {
        this.initRouteParams().subscribe( serviceId => {
            this.getFileInfo(serviceId).subscribe(fileName => {
               this.getExistingFile(serviceId, fileName).subscribe( response => {
                   console.log(response);
                });
            });
        });
}