我有第一个API请求(带有http get)返回一组数据,并且该数据是调用后续API请求(http post)所必需的。
this.service1['get-info'].get().subscribe(data => {
this.info = data.body;
},
error => console.log(error),
()=> {
this.service2['send-email']['post']({body: this.info})
.subscribe(data=>{
console.log(data);
},
error => console.log(error),
() => {
this.id = 0;
});
}
);
因为一个可观察对象具有下一个,错误的块和已完成的块。我将第二个服务放入第一个服务的已完成块中。这是反模式。那么如何使用mergeMap重写代码?
答案 0 :(得分:1)
您应该按照文档描述的方式进行操作。
https://rxjs-dev.firebaseapp.com/api/operators/mergeMap#example
在订阅之前不能调用onError(),但是可以捕获错误并将其传递给外部Observable。您可以使用一种名为.... drum roll ... catchError()的方法来捕获错误!
https://www.learnrxjs.io/operators/error_handling/catch.html
您可以将此方法传递给Observable序列。像这样:
this.service1.get().pipe(
catchError(value => of('some message: ' + value))
mergeMap(nextValue => some mapping logic here)
);
可以工作。
您要么滑倒.pipe()
或.mergeMap()
,要么都滑倒。
如果您了解如何分别使用这两种方法,那么将它们一起使用很容易。
pipe()
只是调用Observable运算符的一种较新的方式,因为点链接的旧方法涉及修补Observable原型并引起大量歇斯底里。 pipe()
出于必要而替换了点链,以保持Observable命名空间/开发人员顶空清洁。
.mergeMap()
只是获取n个嵌套级别的可观察流并将其展平到n-1层深度的一种方法,在展平时应用映射功能。
如果您知道如何展平数组,则类似于Array.prototype.flatMap()。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap
在这种情况下,您的映射函数只是调用另一个返回Observable的服务方法。
.mergeMap((service1ReturnedValue) => {
return this.service2.someServiceMethodThatReturnsAnObservable(service1ReturnedValue));
})
答案 1 :(得分:0)
您可以这样做,
`this.yourFirstService(data).pipe(
map(res => // do what ever you want to do which first reques's response),
mergeMap(() => this.yourSecondService())).subscribe( finalResponse => {
});`
您需要调用第一个服务,然后映射它的响应,以便您可以对第一个服务的响应执行任何操作,然后对第二个服务进行mergeMap。这样,您就可以解决问题。