在第一个可观察者成功后,如何有条件地订阅另一个可观察者?

时间:2020-02-13 13:33:56

标签: javascript angular rxjs

我试图使用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' },
          });
        }
      );

1 个答案:

答案 0 :(得分:1)

  1. 我认为concatMap只是在询问竞争条件(不过,我不知道查询参数更改的频率和容易程度)。我会改用switchMap,因为我想我们从"?id=alice"导航到"?id=bob"的那一刻,爱丽丝令牌的问题就变得无关紧要了。

  2. 通常,有条件地订阅另一个流对switchMapfilter来说应该可以正常工作:

firstStream$.pipe(
    filter(result => someCondition(result)),
    switchMap(result => getAnotherStream(result))
).subscribe(//...

哦,顺便说一句,您的concatMap仅返回流if (params.hasOwnProperty('id'))。可以编译吗?同样在else分支中返回一个可观察值,它甚至可以是EMPTY,但可能应该是throwError