Свойство 'timeout' не существует для типа 'Observable <Object>' - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь перейти на Angular 6 из 5 и получил эту ошибку:

ОШИБКА в src / app / services / http.service.ts (17,14): ошибка TS2339: свойство«timeout» не существует для типа «Observable».

Мой код в http.service.ts:

import { throwError as observableThrowError,  Observable } from 'rxjs';
import { Injectable } from '@angular/core';
import { environment } from "environments/environment";
import { AppService } from 'app/app.service';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class HttpService {

    private baseUrl = environment.apiUrl;

    constructor(private http: HttpClient, private appService: AppService) { }

    public get(endpoint: string): Observable<any>{
        return this.http.get(this.baseUrl + endpoint)
            .timeout(this.appService.timeoutInterval)
            .retryWhen(error => error.delay(this.appService.waitInterval)
                .take(this.appService.numberOfRetries)
                .concat(observableThrowError(new Error())))
            .share();
    }
}

Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Вы должны будете добавить .pipe и затем использовать любой из ваших операторов внутри него начиная с Rxjs 6.

Измените свою реализацию следующим образом:

import { throwError ,  Observable, timer } from 'rxjs';
import { Injectable } from '@angular/core';
import { environment } from "environments/environment";
import { AppService } from 'app/app.service';
import { HttpClient } from '@angular/common/http';

import { 
  timeout,
  retryWhen,
  take,
  concat,
  share,
  delayWhen
} from 'rxjs/operators';

@Injectable()
export class HttpService {

  private baseUrl = environment.apiUrl;

  constructor(
    private http: HttpClient, 
    private appService: AppService
  ) {}

  public get(endpoint: string): Observable < any > {
    return this.http.get(this.baseUrl + endpoint)
      .pipe(
        timeout(2500),
        retryWhen(errors =>
          errors.pipe(
            delayWhen(val => timer(val * 1000))
          )
        ),
        take(2),
        concat(throwError('This is an error!')),
        share()
      );
  }
}

PS: Я позволил себе сменить ваши ссылки AppService. на мою собственную реализацию, так как вы не поделились своим AppService кодом.

0 голосов
/ 11 октября 2018

Вы должны обновить с помощью ng update - см. https://blog.angular.io/version-6-of-angular-now-available-cc56b0efa7a4 (прокрутите немного вниз)

По этой ссылке будет автоматически установлена ​​rxjs-compat, которая включит поддержку RxJs v5 иv6

Однако вы можете установить rxjs-compat вручную, если хотите.

Это упростит переход от ng5 к ng6, а затем (опционально) вытащит его позже в более сфокусированной задаче RxJ.

0 голосов
/ 11 октября 2018

Теперь вместо timeout вы должны использовать debounceTime.Например, из официального документа :

this.heroes$ = this.searchTerms.pipe(
      // wait 300ms after each keystroke before considering the term
      debounceTime(300),

      // ignore new term if same as previous term
      distinctUntilChanged(),

      // switch to new search observable each time the term changes
      switchMap((term: string) => this.heroService.searchHeroes(term)),
    );
...