首页 文章

什么是RxJS中的SwitchMap

提问于
浏览
0

我在Angular 5项目中使用Restangular . 在addErrorInterceptor section中,如果查看代码,则调用 refreshAccesstoken 方法,然后在 switchMap 部分中获取新的访问令牌 . 到现在为止,我正在 refreshAccesstoken 方法中返回一个 replySubject ,所以如果我订阅了返回值,我可以获得新的访问令牌,但我知道它是什么(我've also searched for switchMap but I just found some functions which didn' t帮助我) .

这是我的AuthService.refreshAccessToken代码:

refreshAccessToken() {
  let resultSubject: ReplaySubject<any> = new ReplaySubject<any>();
  const url = this.AUTH_URL + 'oauth/token';
  const requestOptions = {
    headers: new Headers({
      authorization: 'Basic ' + btoa(this.clientId + ':' + this.clientSecret),
      'Content-Type': 'application/x-www-form-urlencoded'
    })
  };
  const body = {
    grant_type: 'refresh_token',
    refresh_token: this.refreshToken,
    // scope: ''
  };
  let params = this.utilityService.convertObjectToURLParams(body);

  this._http.post(url, params.toString(), requestOptions).subscribe(
    response => {
      let result = response.json();
      // console.log('refreshed_access_token', result);
      this.accessToken = result.access_token
      this.refreshToken = result.refresh_token
      this.expireIn = result.expire_in
      resultSubject.next(this.accessToken);
    },
    error => {
      resultSubject.error(error);
    }
  );
  return resultSubject;
}

1 回答

  • 2

    为什么需要使用ReplySubject?您似乎只是用它来发出新的访问令牌 .

    如果是这种情况,如果我不错过任何东西,那么你可以用更简单的方式达到相同的结果,比如

    refreshAccessToken() {
      const url = this.AUTH_URL + 'oauth/token';
      const requestOptions = {
        headers: new Headers({
          authorization: 'Basic ' + btoa(this.clientId + ':' + this.clientSecret),
          'Content-Type': 'application/x-www-form-urlencoded'
        })
      };
      const body = {
        grant_type: 'refresh_token',
        refresh_token: this.refreshToken,
        // scope: ''
      };
      let params = this.utilityService.convertObjectToURLParams(body);
    
      this._http.post(url, params.toString(), requestOptions).map(
        response => {
          let result = response.json();
          // console.log('refreshed_access_token', result);
          this.accessToken = result.access_token
          this.refreshToken = result.refresh_token
          this.expireIn = result.expire_in
          return this.accessToken;
        }
      );
    }
    

    基本上你只需用 map 替换 subscribe 然后它应该工作

相关问题