我有两个API可以顺序调用,第二个API则使用第一个API返回的数据。
我尝试在第一个调用中使用this.dataService.getPlayerData("heunetik").pipe(
concatMap(data => this.dataService.getLifetimeStats(data.payload.guid))
).subscribe(finalData => {
console.log(finalData);
});
,然后使用第二个调用中返回的值,但是当我订阅可观察对象时,我仅获得第二个调用的数据。
如何在一个可观察的时间内从两个调用中获取数据?
:
在阅读文档时,这似乎是最有意义的,但是示例非常令人困惑...:/
答案 0 :(得分:2)
您想要做一些内部映射来组合数据:
this.dataService.getPlayerData("heunetik").pipe(
switchMap(data => this.dataService.getLifetimeStats(data.payload.guid)
.pipe(map(innerData => [data, innerData])))
).subscribe(finalData => {
console.log(finalData);
});
这将返回数组中的数据,第一个数据设置为0,第二个数据设置为1。
switchMap只是我的偏爱,在switch / concat / merge之间并没有什么关系...它们的用途略有不同,这与多次排放有关,但是它们在这里都将发挥相同的作用,因为这些都是单一排放可观察的。我更喜欢使用switch,因为我认为从语义上讲我更期待单一排放,但是在这一点上意见可能会有所不同。
高阶映射曾经用来提供允许该组合的第二个参数,但他们使用rxjs 5或6左右的参数将其删除,转而使用内部映射模式来节省导入大小(这是一个糟糕的决定。 。map参数经常有用,并且内部图看起来很混乱。
答案 1 :(得分:1)
我们使用mergeMap也称为flatMap来映射/迭代Observable值。
this.dataService.getPlayerData("heunetik").pipe(
mergeMap(data => this.dataService.getLifetimeStats(data.payload.guid))
.pipe(map(data2=>([data,data2])
).subscribe(finalData => {
console.log(finalData);
});