【问题标题】:Angular 2 rxJs, subscribe errorAngular 2 rxJs,订阅错误
【发布时间】:2017-06-24 20:19:11
【问题描述】:

我在某些服务中有方法:

public approveTokenExpiration(): Observable<any> {
    let header = new Headers();
    header.append('Authorization', this.getTokenHeaderValue());
    let options = new RequestOptions({headers: header});
    return this.http.get(Constants.oauthLoginEndPointUrl, options)
      .map(res => {
        return res;
      })
      .catch(err => {
        return refreshToken()
          .subscribe(res => {
            return res;
          });
      });
  }

刷新令牌方法:

public refreshToken(): Observable<any> {
    let refreshToken = localStorage.getItem(Constants.REFRESH_TOKEN);
    let refreshEndPointUrl = Constants.oauthLoginEndPointUrl + "?grant_type=refresh_token&client_id=" +
      Constants.clientId + "&client_secret=" + Constants.clientSecret + "&refresh_token=" + refreshToken;
    this.http
      .post(refreshEndPointUrl, {})
      .map(res => {
        this.setAuthLocalStorageItems(res);
        this.removeAuthLocalStorageItems();
        return res;
      });
  }

和订阅:

request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
    this.customOptions = options;
    return this.authService.approveTokenExpiration()
      .subscribe(
        res => {
          this.addAuthHeader();
          return super.request(url, this.customOptions);
        },
        err => {
          this.authService.refreshToken();
          this.addAuthHeader();
          return super.request(url, this.customOptions);
        });
  }

我收到以下错误:

[at-loader] 中的错误 ./src/app/auth/intercept/auth.interceptor.ts:18:5 TS2322:“订阅”类型不可分配给“可观察”类型。 “订阅”类型中缺少属性“_isScalar”。

请检查我的 RxJs 处理是否一切正常;

【问题讨论】:

    标签: http rxjs angular2-services


    【解决方案1】:

    您的代码存在一些问题。您提出的具体问题是由这部分引起的:

    request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
        this.customOptions = options;
        return this.authService.approveTokenExpiration()
          .subscribe(... // <- this will return a Subscription
    

    请注意,您将request 函数定义为返回Observable&lt;Response&gt; 类型的结果。但是,您的 return 语句返回 ...subscribe(),即 Subscription。如果你想返回一个 observable,不要调用.subscribe()。只需返回您从approveTokenExpiration() 获得的信息

    你在正确的轨道上。 request 函数应返回 Observable。调用代码(您的组件)应该在该 Observable 上调用 .subscribe(),因为此时会触发请求。

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 2021-12-19
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多