Как я могу вернуть наблюдаемое в Angular 7? - PullRequest
0 голосов
/ 20 ноября 2018

У меня был проект, который ранее был на Angular 5.x, и я обновил его до 7. Есть конкретный случай, когда мне нужно вернуть наблюдаемый httpClient, но я не могу понять, как он изменился в Angular 7. Это выдает мне ошибку при "вылове" функции callApi. [ts] Свойство 'catch' не существует для типа 'Observable'. [2339] моя ошибка

callApi(url: string): Observable<any> {

    return this.httpClient
        .get(url)
        .catch(this.handleError);
}

Это весь код в моем файле config.service.ts.

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/throw';

import { environment } from './../environments/environment';

@Injectable()
export class ConfigService {

    private configUrl = environment.production ? './assets/config/config.prod.json' : './assets/config/config.dev.json';

    private _config: any;

    constructor(private httpClient: HttpClient) {
    }

    load(): Promise<any> {

        let promise: Promise<any> = new Promise((resolve: any) => {

            this.callApi(this.configUrl)
                .subscribe(config => {
                    this._config = config;
                    resolve(true)
                });
        });
        return promise;
    }

    getConfig(key: any) {
        return this._config[key];
    }

    private handleError(error: Response | any) {
        let errMsg: string;
        if (error instanceof Response) {
            let body = {}
            try {
                body = error.json();
            } catch (e) {
            }
            const err = body['error'] || JSON.stringify(body);
            errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
        } else {
            errMsg = error.message ? error.message : error.toString();
        }

        console.error(errMsg);

        return Observable.throw(errMsg);
    }

    callApi(url: string): Observable<any> {

        return this.httpClient
            .get(url)
            .catch(this.handleError);
    }
}

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Обновите вашу rxjs библиотеку до более поздней версии и измените следующий код - Вам нужно использовать pipe операторов из rxjs, которые могут решить вашу catchError() проблему - измените catch на catchError

Попробуйте что-то вроде этого

callApi(url: string): Observable<any> {

    return this.httpClient
        .get(url).pipe(catchError(this.handleError));
}

Надеюсь, это поможет - Удачного кодирования:)

0 голосов
/ 20 ноября 2018

В дополнение к использованию catchError вместо catch, поскольку HttpClient возвращает Observable, учтите, что подписка на Observable имеет 3 параметра обратного вызова, соответствующих событиям успеха, событиям ошибки, а затем событию завершения, когда соединение завершено, что он делал (на самом деле вы можете игнорировать это большую часть времени). Итак, ваш код может выглядеть так:

config.service.ts

callApi(url: string): Observable<any> {
    return this.httpClient
        .get(url)
        .pipe(catchError(this.handleError)); // adjust handleError function, as necessary
}

some.component.ts

this.configService.callApi('https://google.com')
  .subscribe(
    goodResult => console.log(goodResult),
    error => console.log(error),
    () => console.log('the api call is done!')
  )
0 голосов
/ 20 ноября 2018

Angular 6 перешел с RxJs 5 на RxJs 6, и есть несколько критических изменений.

catch был переименован в catchError

https://www.academind.com/learn/javascript/rxjs-6-what-changed/

ЕстьБиблиотека совместимости, которую вы можете установить при обновлении с RxJs 5 до 6, но лучше изменить код так, чтобы он был совместим с RxJs 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...