我正在尝试使用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值。
答案 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'),
});