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
实例时可用。
场景: 服务需要加载成员信息。为此,它需要 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
实例时可用。