crd*_*deu 1 javascript observable rxjs angular
我正在使用observables和flatMap运算符,我编写了一个方法,它调用并调用API并返回带有对象数组的observable.基本上我需要的是获取对象数组并处理每个对象,在处理完所有项之后,我想链接结果以使用我编写的另一个方法进行额外的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);
});
});
Run Code Online (Sandbox Code Playgroud)
但是从我的角度来看,这种方法并不是最优的,我想使用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);
});
Run Code Online (Sandbox Code Playgroud)
第二个API调用对apiData对象数组上的每个项执行一次.我知道我错过了或误解了什么.但是从这个帖子的第二个答案为什么我们需要使用flatMap?我认为第二个flatMap应该返回已处理的apiData,而是返回该Array上的每个对象项.我很感激你的帮助.
谢谢.
你想要的是.do()运营商,而不是flatMap().flatMap()将事件转换为另一个事件,实质上是将它们链接起来..do()只执行你指示它做的任何事情,对事件中的每一次发射.
从您的代码中,有2个异步方法(调用api)和2个同步(processService).你想要做的是:
因此,您的代码应该是:
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);
});
Run Code Online (Sandbox Code Playgroud)
我在评论中写了与上面列表相对应的步骤.我还清理了不必要的操作员(就像你的第一个flatMap有点多余).
此外,如果您想要转换数据,那么您应该使用.map()而不是.do().我认为,在这里你感到困惑与地方.map()和.flatMap().
| 归档时间: |
|
| 查看次数: |
3836 次 |
| 最近记录: |