条件在 rxjs 中执行平面图 - angular 5
Condition the execution of a flatmap in rxjs - angular 5
在 rxjs 中,我想在多个平面图上设置条件,所以我不执行第二个和第三个平面图,而是直接转到订阅:
this.authenticationAPI.getUser()
.flatmap(response1 => if(response1 != null) // I want to go directly to subscribe
.flatmap(response2 => return observable2(response2))
.flatmap(response3 => return observable3(response3))
.subscribe(response 4 => console.log(response4));
我考虑过将 null observables 传递给第二个和第三个平面图,但还有其他解决方案吗?
您应该区分两种情况:使用 filter
的失败和成功。这种方式更具声明性,更易于阅读
const response$ = this.authenticationAPI.getUser();
// failure
response$
.filter((res) => !res)
.subscribe(() => {
console.log('Unauthentication')
});
// success
response$
.filter((res) => res)
.flatmap(response2 => return observable2(response2))
.flatmap(response3 => return observable3(response3))
.subscribe(response 4 => console.log(response4));
最好稍微嵌套平面图 - 此示例使用 RxJS 5.5/6 "pipe" 运算符,如果您使用的是早期版本的 RxJS,则需要稍微将其转换为映射到旧语法(如果需要,请发表评论,我将添加一个示例):
this.authenticationAPI.getUser().pipe(
map((response1) => {
if (response1 != null) return of(response1);
else return of(response1).pipe(
flatMap((response2) => observable2(response2)),
flatMap((response3) => observable3(response3))
)
})
).subscribe(response1or4 => console.log(response1or4));
在 rxjs 中,我想在多个平面图上设置条件,所以我不执行第二个和第三个平面图,而是直接转到订阅:
this.authenticationAPI.getUser()
.flatmap(response1 => if(response1 != null) // I want to go directly to subscribe
.flatmap(response2 => return observable2(response2))
.flatmap(response3 => return observable3(response3))
.subscribe(response 4 => console.log(response4));
我考虑过将 null observables 传递给第二个和第三个平面图,但还有其他解决方案吗?
您应该区分两种情况:使用 filter
的失败和成功。这种方式更具声明性,更易于阅读
const response$ = this.authenticationAPI.getUser();
// failure
response$
.filter((res) => !res)
.subscribe(() => {
console.log('Unauthentication')
});
// success
response$
.filter((res) => res)
.flatmap(response2 => return observable2(response2))
.flatmap(response3 => return observable3(response3))
.subscribe(response 4 => console.log(response4));
最好稍微嵌套平面图 - 此示例使用 RxJS 5.5/6 "pipe" 运算符,如果您使用的是早期版本的 RxJS,则需要稍微将其转换为映射到旧语法(如果需要,请发表评论,我将添加一个示例):
this.authenticationAPI.getUser().pipe(
map((response1) => {
if (response1 != null) return of(response1);
else return of(response1).pipe(
flatMap((response2) => observable2(response2)),
flatMap((response3) => observable3(response3))
)
})
).subscribe(response1or4 => console.log(response1or4));