我正在使用可观察量和 flatMap 运算符,我编写了一个方法,该方法进行 API 调用并返回带有对象数组的可观察量。
基本上我需要的是获取对象数组并在处理所有项目后处理每个对象。我想将结果链接起来,以使用我编写的另一个方法进行额外的 API 调用。
以下代码满足我的需要:
this.apiService.getInformation('api-query', null).first().flatMap((apiData) => {
return apiData;
}).subscribe((dataObject) => {
this.processService.processFirstCall(dataObject);
}, null, () => {
this.apiService.getInformation('another-query', null).first().subscribe((anotherQueryData) => {
this.processService.processSecondCall(anotherQueryData);
});
});
但从我的 Angular 来看,这种方法并不是最佳的,我想使用 flatMap 链接这些调用,但如果我执行以下操作:
this.apiService.getInformation('api-query', null).first().flatMap((apiData) => {
return apiData;
}).flatMap((dataObject) => {
this.processService.processFirstCall(dataObject);
return [dataObject];
}).flatMap((value) => {
return this.apiService.getInformation('another-api-query', null).first();
}).subscribe((value) => {
this.processService.processSecondCall(value);
});
第二个 API 调用针对 apiData 对象数组中的每个项目执行一次。我知道我遗漏或误解了某些东西。但从这个线程的第二个答案Why do we need to use flatMap? ,我认为第二个 flatMap 应该返回处理后的 apiData,而不是返回该数组上的每个对象项。我将不胜感激的帮助。
谢谢。
最佳答案
你想要的是.do()
运算符,而不是 flatMap()
。 flatMap()
会将一个事件转换为另一个事件,本质上是将它们链接起来。 .do()
只是对事件中的每次发射执行您指示它执行的任何操作。
从您的代码中,有 2 个异步方法(调用 api)和 2 个同步方法(processService)。你想做的是:
- 调用第一个 API(异步),等待结果
- 处理结果(同步)
- 调用第二个API(异步),等待结果返回
- 处理结果(同步)
因此您的代码应该是:
this.apiService.getInformation('api-query', null)//step1
.first()
.do((dataObject) => this.processFirstCall(dataObject))//step2
.flatMap(() => this.apiService.getInformation('another-api-query', null))//step3
.first()
.do(value => this.processService.processSecondCall(value))//step4
.subscribe((value) => {
console.log(value);
});
我在评论中写了与上面列表相对应的步骤。我还清理了不必要的运算符(比如你的第一个 flatMap
有点多余)。
此外,如果您想转换数据,则应该使用 .map()
而不是 .do()
。我认为这就是您与 .map()
和 .flatMap()
混淆的地方。
关于javascript - 使用 flatMap 链接可观察量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45355108/