链3个或更多相关可观察物

时间:2018-11-20 09:53:07

标签: observable rxjs6 angular7 rxjs-pipeable-operators

我知道在here之前已经问过这个问题。但是接受的解决方案对我不起作用,或者我听不懂。

我正在使用ng-7 我有一个简单的用例:

我有2个API,第2个依赖于第1个的响应。 我订阅了第一个API的结果,然后使用管道订阅了第二个API的结果。

我的代码如下:

this._SomeService
        .addUserToDb(payload)
        .pipe(
          map(res => res),
          mergeMap(db1Response =>
            this._SomeService.addUserToDb2(db1Response
            )
          ),
          catchError(errodb1 => {

            return Observable.throw(new 
            Error(errorSso));
          })
        )
        .subscribe(
          resDb2 => {
              // Here I get response of addUserToDb2
          },
          errDb2 => {


          }
        )

现在,在订阅第二个API响应之前,我想订阅另一个可观察的说法:

this._tokenService.getToken.pipe(

并想在服务2中使用它的响应。 这样:

API1 =>令牌=> API2

请建议如何实施。

更新:

我尝试实现,以下是我的实现:

  this._service.addUserToDB1(payload).pipe(
          map(resp => this.resDB1 = resp) // Adding to global variable because I need this response while subscribing to DB2 service.
          ,mergeMap(resdb1=>this._tokenService.getToken.pipe(
            mergeMap(token => this._service.addUserToDb2(
              this.resDB1,
              this.organizationId,
              this.practitionerId,
              token
            ),
            catchError(errorToken => {

              return Observable.throw(new Error(errorToken));
            })),
            )
          ),
          catchError(errordb1 => {

            return Observable.throw(new Error(errordb1));
          })

      ).subscribe (
        resdb2Response =>
        {

        },
        errdb2 => {

        }
      )

有人可以验证上述实施是否正确或建议正确的方法吗?

1 个答案:

答案 0 :(得分:5)

mergeMap 运算符在这里很好,因为Api请求发出1个事件然后完成,但是要准确请使用switchMap或concatMap而不是mergeMap 。如果您有兴趣,也请查看有关这些运算符的帖子。 RxJs Mapping Operators: switchMap, mergeMap, concatMap

对于您的代码块,我建议使用类似的东西:

this._service.addUserToDB1(payload).pipe(
  catchError(errordb1 => {
    // do something with error if you want
    return Observable.throw(new Error(errordb1));
  }),
  tap(resp => this.resDB1 = resp),
  switchMap(resdb1 => this._tokenService.getToken),
  catchError(errorToken => {
    // do something with error if you want
    return Observable.throw(new Error(errorToken));
  }),
  switchMap(token => this._service.addUserToDb2(
    this.resDB1,
    this.organizationId,
    this.practitionerId,
    token
  )),
  catchError(errordb2 => {
    // do something with error if you want
    return Observable.throw(new Error(errordb2));
  }),
).subscribe(
  resdb2Response => {

  },
  anyError => {
    // any of the errors will come here
  }
)
  • tap()运算符就像只是做一些事情,不对发出的事件进行任何更改。如果您只想做某事,而不是转换发出的事件,则最好轻按地图。