如何使用mergeMap链接服​​务调用?

时间:2019-07-24 22:49:54

标签: angular rxjs observable

我有第一个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重写代码?

2 个答案:

答案 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。这样,您就可以解决问题。