Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Angular 4如何等待httpclient完成大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我有自定义基本服务继承的服务(正在调用其余服务),该服务定义了在所有其他服务中使用的公共方法属性.其中一个参数是我的休息服务的基本URL,它在环境下使用变量.但是现在需要使这个url来自配置文件.因此,我必须使用httpclient来获取它,这提出了一个问题,现在当实际服务尝试使用基本URL时,它还没有解决.有没有办法等待电话结算?
我的代码看起来像:

service.service.ts:

export class Baseservice{
    protected apiUrlBase: String;

    constructor(protected _http: httpClient) {
        // some logic

        this.getConfigData()
          .subscribe(
            x => {
              this.apiUrlBase = x.apiUrlBase;
            }
          );

    }

    getConfigData(): Observable<any> {
        return this._http.get(
          '../../assets/config.json'
        )
          .do(x => {
          })
          .catch(error => {
            alert('Unable to read configuration file:' + JSON.Stringify(error));
            return Observable.throw(error);
          });
      }
}

一些-data.service.ts:

@Injectable()
export class Testservice extends BaseApiservice {
    private get _someDataserviceUrl(): String {
        return this.apiUrlBase + '/api/v1/somedata';
    }

    constructor(_http: httpClient) {
        super(_http);
    }

    getSomeData(): Observable<ISomeData[]> {
        return this._http.get<ISomeData[]>(this._someDataserviceUrl)
          .do(this.handlesuccessResponsE)
          .catch(this.handleErrorResponsE);
    }
}

有关我如何等待我的服务直到apiUrl得到解决的任何建议,或者我应该怎样做才能使用我的baseservice以及使用子服务所依赖的数据直到他们使用它?

解决方法

@H_673_22@ 快速而肮脏的是使URL基础本身是可观察的,并确保服务中的任何内容可以继续,直到它给出一个值:

export class Baseservice{
protected apiUrlBase: BehaviorSubject<String> = new BehaviorSubject<String>(null);
protected apiUrlBase$: Observable<String> = this.apiUrlBase.filter(b => !!b).take(1);

constructor(protected _http: httpClient) {
    // some logic

    this.getConfigData()
      .subscribe(
        x => {
          this.apiUrlBase.next(x.apiUrlBasE);
        }
      );

}

getConfigData(): Observable<any> {
    return this._http.get(
      '../../assets/config.json'
    )
      .do(x => {
      })
      .catch(error => {
        alert('Unable to read configuration file:' + JSON.Stringify(error));
        return Observable.throw(error);
      });
  }
} 


@Injectable()
export class Testservice extends BaseApiservice {
  private _someDataserviceUrl(apiUrlBasE): String {
      return apiUrlBase + '/api/v1/somedata';
  }

  constructor(_http: httpClient) {
      super(_http);
  }

  getSomeData(): Observable<ISomeData[]> {
      return this.apiUrlBase$.switchMap(apiUrlBase => this._http.get<ISomeData[]>(this._someDataserviceUrl(apiUrlBasE))
        .do(this.handlesuccessResponsE)
        .catch(this.handleErrorResponsE));
  }
}

但这显然非常难看.更好的解决方案是通过为应用程序创建应用程序初始化程序提供程序,确保此基本服务在应用程序中的任何其他内容之前加载和解析:

import { Injectable,APP_INITIALIZER } from '@angular/core';

@Injectable()
export class Baseservice{
  protected apiUrlBase: String;

  constructor(protected _http: httpClient) {
  }

  getConfigData(): Observable<any> {
    return this._http.get(
      '../../assets/config.json'
    )
      .do(x => {
      })
      .catch(error => {
        alert('Unable to read configuration file:' + JSON.Stringify(error));
        return Observable.throw(error);
      });
  }

  public load() {
     return new Promise((resolve,reject) => {
       this.getConfigData()
         .subscribe(
           x => {
             this.apiUrlBase = x.apiUrlBase;
             resolve(true);
           },err => resolve(err)
         );
     });
  }
}

export function BaseserviceInitFactory(baseservice: BaseservicE) {
  return () => baseservice.load();
}

export const BaseserviceInitProvider = {
  provide: APP_INITIALIZER,useFactory: BaseserviceInitFactory,deps: [Baseservice],multi: true
}

然后将BaseserviceInitProvider放在您的应用程序模块提供程序中的Baseservice之后.

大佬总结

以上是大佬教程为你收集整理的Angular 4如何等待httpclient完成全部内容,希望文章能够帮你解决Angular 4如何等待httpclient完成所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。