代码之家  ›  专栏  ›  技术社区  ›  Keithers

如何返回角度为7的可观测值?

  •  0
  • Keithers  · 技术社区  · 5 年前

    我以前在Angular 5.x上有一个项目,我将其更新为7。有一个特殊的实例,我需要返回一个httpClient observable,但我无法理解它在Angular 7中是如何变化的。这给了我一个关于callApi函数“catch”的错误[ts]属性“catch”在类型“Observable”上不存在[这是我的错误

    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 回复  |  直到 5 年前
        1
  •  4
  •   Rahul    5 年前

    更新您的 rxjs 库到更高版本,并更改以下代码-您需要使用 pipe 来自 那可能会解决你的问题 catchError() 问题-更改您的 catch 作为 catchError

    试试这样的

    callApi(url: string): Observable<any> {
    
        return this.httpClient
            .get(url).pipe(catchError(this.handleError));
    }
    

        2
  •  2
  •   Adrian Brand    5 年前

    Angular 6从RxJs 5到RxJs 6,有一些突破性的变化。

    catch已重命名为catchError

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

    当您从RxJs 5升级到6时,可以安装一个兼容库,但最好将代码修改为RxJs 6兼容。

        3
  •  1
  •   Ben Steward    5 年前

    除了使用 catchError catch 因为HTTPclipse返回一个可观察的,考虑到一个可观察到的订阅有3个对应于成功事件的回调参数,错误事件,然后当连接完成它正在做的事情时的一个完成事件(实际上,你可以在大多数时候忽略这个)。因此,您的代码可以如下所示:

    config.service.ts

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

    一些

    this.configService.callApi('https://google.com')
      .subscribe(
        goodResult => console.log(goodResult),
        error => console.log(error),
        () => console.log('the api call is done!')
      )