Angular 2 HTTP属性重试在Observable <any>类型上不存在

efa*_*ley 6 observable rxjs angular

我试图重试我的请求,以便我可以在发送用户再次登录之前获得刷新令牌,但是当我尝试使用retryWhen请求时我收到错误,我不知道为什么.

http.service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Http, Headers, RequestOptions, Response } from '@angular/http';

@Injectable()
export class HttpService {

  constructor(
    private http: Http
  ) { }

  public get(url: string, headers?: Headers): Observable<any> {
    return this.http.get(url, this.getHeaders(headers))
      .map(this.extractData)
      .retryWhen((error: any) => { ... }) // [ts] Property 'retryWhen' does not exist on type 'Observable<any>'.
      .catch(this.handleError);
  }
}
Run Code Online (Sandbox Code Playgroud)

Omr*_*zon 10

在使用之前必须首先导入运算符(对于其他运算符,它的作用相同)

将它放在文件顶部的导入中:

import 'rxjs/add/operator/retryWhen';
Run Code Online (Sandbox Code Playgroud)

它将此运算符添加到Observable原型的顶部.


efa*_*ley 2

使用几天后,Omri 发布的原始解决方案导致了一些问题,有时无法找到该属性。(它在某些版本中有效,但在其他版本中无效)。我最终找到了一个更好的解决方案,该解决方案工作更加一致并且不需要额外的导入。

不是从 rxjs/Observable 导入 Observable,而是从 rxjs/Rx 导入它。

不起作用

import { Observable } from 'rxjs/Observable';
Run Code Online (Sandbox Code Playgroud)

确实有效:

import { Observable } from 'rxjs/Rx';
Run Code Online (Sandbox Code Playgroud)

  • 它们都应该工作(`'rxjs/Rx'`,''rxjs/Observable'`,甚至只有 **`'rxjs'`**),Observable 在 RxJS 库中多次导出。您的问题实际上是您没有导入运算符。您在标题中出现的错误确认了 Observable 类型已导入,但运算符不可用。 (6认同)