我试图使用concatmap并在queryParams具有id时按顺序完成可观察对象,它应该仅调用getbearer令牌,否则应该使用安全密钥导航到错误,但实际上,它会使用不记名令牌进入错误页面
const result = this.activatedRoute.queryParams.pipe(
concatMap((params) => {
if (params.hasOwnProperty('id')) {
sessionStorage.setItem('secureKey', params.id);
return this.httpServiceService.getBearerTokens();
} else {
this.router.navigate(['error'], {
queryParams: { 'error-key': 'secure-key' },
});
}
})
);
result.subscribe(
(response: any) => {
if (response.access_token) {
sessionStorage.setItem('bearerToken', response.access_token);
this.router.navigate(['summary']);
} else {
this.router.navigate(['error'], {
queryParams: { 'error-key': 'bearer-token' },
});
}
},
(error) => {
this.router.navigate(['error'], {
queryParams: { 'error-key': 'bearer-token' },
});
}
);
答案 0 :(得分:1)
我认为concatMap
只是在询问竞争条件(不过,我不知道查询参数更改的频率和容易程度)。我会改用switchMap
,因为我想我们从"?id=alice"
导航到"?id=bob"
的那一刻,爱丽丝令牌的问题就变得无关紧要了。
通常,有条件地订阅另一个流对switchMap
和filter
来说应该可以正常工作:
firstStream$.pipe(
filter(result => someCondition(result)),
switchMap(result => getAnotherStream(result))
).subscribe(//...
哦,顺便说一句,您的concatMap
仅返回流if (params.hasOwnProperty('id'))
。可以编译吗?同样在else
分支中返回一个可观察值,它甚至可以是EMPTY
,但可能应该是throwError
。