观测值序列完成时通知

时间:2018-12-10 21:34:10

标签: typescript rxjs observable

我正在尝试使用RxJS Observables根据用户选择来过滤对象列表。要获取过滤对象的列表,我需要依次调用三个单独的服务,并将值从上一个服务传递到下一个服务。

注意1:这三个服务中的每一个都返回Observable

注意2::每个服务可以返回任意数量的结果,每个结果都需要传递给下一个服务。

只有在第三项服务完成发射所有值之后,我的代码才能正常继续。

这是我现在拥有的:

this.firstService.getFirstResults(filterOption)
            .subscribe(firstResult => this.secondService.getSecondResults(firstResult)
                .subscribe(secondResult => this.thirdService.getThirdResults(secondResult)
                    .subscribe(thirdResult => this.processResult(thirdResult, firstResult),
                    null,
                    () => console.log("COMPLETE")))
            );

上面的代码对我来说几乎是完美的。最后,processResult()函数可以正确地构建一个包含所有过滤对象的数组。

但是,当Observable的序列真正完成时,我不知道如何获得通知。我曾希望第三项服务的complete部分能够完成这项工作,但是它多次打印到控制台,而不是一次打印。

注意3::在对processResult()的最后一次调用中,我需要同时传递thirdResult值以及从firstService.getFirstResults()返回的相应firstResult值。

1 个答案:

答案 0 :(得分:0)

switchMap提供了第二个参数来重组返回值,下面是演示演示如何做。

function getResult(filterOption) {
  return this.firstService.getFirstResult(filterOption).pipe(
    switchMap(
      firstResult => this.secondeService.getSecondResult(firstResult),
      ([firstResult, secondResult]) => ({ firstResult, secondResult }),
    ),
    switchMap(
      ({ secondResult }) => this.thirdService.getThirdResult(secondResult),
      ([{ firstResult }, thirdResult]) => ({ firstResult, thirdResult }),
    ),
  );
}

getResult(filterOption).subscribe({
  next: ({ firstResult, thirdResult }) => this.processResult(thirdResult, firstResult),
  completed: () => console.log('completed'),
});