大佬教程收集整理的这篇文章主要介绍了Angular 4如何等待httpclient完成,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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以及使用子服务所依赖的数据直到他们使用它?
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 }
以上是大佬教程为你收集整理的Angular 4如何等待httpclient完成全部内容,希望文章能够帮你解决Angular 4如何等待httpclient完成所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。