Цепочка 3 или более зависимых наблюдаемых - PullRequest
0 голосов
/ 20 ноября 2018

Я знаю, что этот вопрос задавался раньше здесь .Но принятое решение не работает для меня, или я не могу его хорошо понять.

Я использую ng-7 У меня есть простой вариант использования:

У меня 2 API, 2-й -зависит от 1-го ответа.Я подписываюсь на результат 1-го API, а затем с помощью pipe подписываюсь на 2-й результат 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 => token => 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 голосов
/ 27 ноября 2018
Оператор

mergeMap в порядке, так как Api запрашивает отправку 1 события и затем завершается, но если быть точным , пожалуйста, используйте switchMap или concatMap вместо mergeMap .Пожалуйста, посмотрите на этот пост и об этих операторах, если вы заинтересованы. Операторы отображения RxJs: 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
  }
)
...