代码之家  ›  专栏  ›  技术社区  ›  Always_a_learner

链3或更多相关观测

  •  2
  • Always_a_learner  · 技术社区  · 6 年前

    我知道以前有人问过这个问题 here . 但是被接受的解决方案对我来说不起作用,或者我不能很好地理解它。

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

    我有两个API,第二个依赖于第一个的响应。 我订阅第一个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响应之前,我想订阅另一个可观察的,比如:

    这是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 回复  |  直到 6 年前
        1
  •  3
  •   Goga Koreli    6 年前

    合并映射 这里的运算符很好,因为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() 操作人员就像是在做一些事情,不要将任何事情更改为已发出的事件。当您只想做一些事情时,最好点击而不是地图,而不是转换发射的事件。
    推荐文章