如何顺序调用两个 API 并将两者的数据作为单个 Observable 返回

heu*_*tik 2 javascript observable rxjs angular

我有两个 API 可以顺序调用,第一个 API 返回的数据用于第二个 API。

我尝试concatMap在第一个调用中使用,然后使用第二个调用中返回的值,但是当我订阅可观察对象时,我只得到第二个调用的数据。

如何在单个可观察对象中从两个调用中获取数据?

this.dataService.getPlayerData("heunetik").pipe(
    concatMap(data => this.dataService.getLifetimeStats(data.payload.guid))
).subscribe(finalData => {
    console.log(finalData);
});
Run Code Online (Sandbox Code Playgroud)

阅读文档,这似乎是最有意义的,但示例非常混乱......:/

bry*_*n60 6

你想做某种内部映射来组合数据:

this.dataService.getPlayerData("heunetik").pipe(
    switchMap(data => this.dataService.getLifetimeStats(data.payload.guid)
                          .pipe(map(innerData => [data, innerData])))
).subscribe(finalData => {
    console.log(finalData);
});
Run Code Online (Sandbox Code Playgroud)

这将返回数组中的数据,第一个数据设置为 0,第二个数据设置为 1。

switchMap 只是我的偏好,在 switch/concat/merge 之间并不重要……它们都有略微不同的用途,这对多次发射很重要,但它们在这里的功能都相同,因为这些都是单发射可观测值。我更喜欢 switch,因为我认为在语义上更清楚我期待单次排放,但在这一点上可能会有不同的意见。

高阶映射用于提供允许这种组合的第二个参数,但他们使用 rxjs 5 或 6 左右将其删除,以支持内部映射模式以节省导入大小(IMO 是一个错误的决定......映射参数经常有用,而且内部地图看起来很杂乱)。