Observable flatMap 转换错误处理,传递导致错误的值

Observable flatMap transformation error handling with passing the error-causing value

场景: 服务需要加载成员信息。为此,它需要 1) 加载成员的 ID,以及 2) 加载详细信息。步骤1是强制性的(如果失败,整个过程应该return出错),步骤2是可选的(如果失败,只有id的记录被returned)。

环境:Angular6,打字稿

代码:

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() 函数中获取 id 并在 getMemberInfo() 失败时将其作为参数传递到 catchError 块中。 catchError 只有一个错误对象作为参数,但是我需要以某种方式访问​​上层 Observable 的结果。

你应该 catchError 像这样在 inner observable 中:

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

在内部 observable 中使用 catchError 将使 id 在您返回 Member 实例时可用。