Обнаруживаемая обработка ошибок преобразования flatMap с передачей вызывающего ошибку значения - PullRequest
0 голосов
/ 25 июня 2019

Сценарий: Сервис должен загрузить информацию об участнике. Для этого ему необходимо 1) загрузить идентификатор участника и 2) загрузить подробную информацию. Шаг 1 является обязательным (если он завершается неудачно, весь процесс должен вернуть ошибку), шаг 2 является необязательным (если он терпит неудачу, возвращается запись только с идентификатором).

Среда: угловая 6, машинопись

Код:

public getMemberId() : Observable<string> { .. doing some http request ...}
public getMemberInfo(memberId : int) : Observable<Member> { 
  ... some code ... 
  return new Member(loaded_id, loaded_name);
}

// expected final usage:
loadUser().subscribe(
  res => ... at least member-id was loaded
  err => ... member-id was not loaded
)

// the not-working implementation:
public loadUser() : Observable<Member> {
  this.getMemberId().pipe(
    flatMap(id => getMemberInfo(id)),
    catchError(err => 
      new Member(id, "John Doe")) // how to get 'id' here??
}

Я думаю, что "flatMap" - правильное преобразование для меня, поскольку я пытаюсь преобразовать идентификатор участника в полную информацию об участнике. Однако я не знаю, как получить в id из успешно завершенной функции getMemberId() и передать его в качестве параметра в блоке catchError, когда getMemberInfo() не удается. catchError имеет только объект ошибки в качестве параметра, однако мне нужно как-то получить доступ к результату верхнего Observable.

1 Ответ

0 голосов
/ 25 июня 2019

Вы должны catchError во внутренней наблюдаемой, как это:

this.getMemberId()
        .pipe(
          mergeMap(id => {
              return this.getMemberInfo(id)
                        .pipe(
                          catchError(error => {
                            return new Member(id, "John Doe")) // how to get 'id' here??
                          });
              })
          );

Использование catchError во внутренней наблюдаемой сделает идентификатор доступным, пока вы возвращаете Member экземпляр.

...