나는이 시나리오를 가지고있다.
backend.json
{
"devServer": "http://server1/'",
"proServer" : "http://server2/'",
"use" : "devServer"
}
global.service.ts
import {Injectable} from '@angular/core';
import {Http, HTTP_PROVIDERS, Response, RequestOptions, URLSearchParams} from '@angular/http';
@Injectable()
export class GlobalService {
constructor(private _http: Http){}
getBackendServer(){
return this.server = this._http.get('./backend.json')
.map((res:Response) => res.json())
}
}
그리고이 다른 서비스를했습니다 : search.service.ts
import {Injectable} from '@angular/core';
import {Http, HTTP_PROVIDERS, Response, RequestOptions, URLSearchParams} from '@angular/http';
import {GlobalService} from '../services/global.service';
import 'rxjs/add/operator/map';
@Injectable()
export class SearchService {
server;
constructor( private _http: Http, private gs: GlobalService ) {
this.server = gs.getBackendServer().subscribe(
(data) => {
this.server = data[data.use];
},
(err) => {
console.log(err);
}
);
}
DoGeneralSearch(params:Search){
console.log(this.server);
let options = this.buildOptions(params);
return this._http.get(this.server + 'room/search', options)
.map((res:Response) => res.json())
}
}
수행 할 작업 : 분명히 보입니다 : JSON 파일에 백엔드 서버의 URL에 관한 정보를 보관하고 싶습니다. 그리고 글로벌 서비스가 서버를 반환해야 검색 서비스의 모든 방법에서이 서버를 사용할 수 있습니다.
문제는 다음과 같습니다. DoGeneralSearch () 메소드는 글로벌 서비스가 JSON 파일을 읽고 결과를 반환하는 태스크를 해결하기 전에 실행됩니다. 그래서 this.server = 구독자 {isUnsubscribed : false, syncErrorValue : null, syncErrorThrown : false, syncErrorThrowable : false, isStopped : false ...} 대신 결과 자체.
this.server 변수를 해결 한 직후에 DoGeneralSearch 메소드가 실행되지 않도록하는 방법을 찾아야합니다.
어떤 제안?
응용 프로그램 시작시 이러한 힌트를 미리로드 할 수 있다고 생각합니다. 이를 위해APP_INITIALIZER
서비스. 응용 프로그램은 실제로 시작하기 전에 반환 된 약속이 해결 될 때까지 대기합니다.
다음은 샘플입니다.
provide(APP_INITIALIZER, {
useFactory: (service:GlobalService) => () => service.load(),
deps:[GlobalService, HTTP_PROVIDERS], multi: true
})
그만큼load
메소드는 다음과 같은 것을 원할 것이다 :
load():Promise<Site> {
var promise = this.http.get('config.json').map(res => res.json()).toPromise();
promise.then(config => this.devServer = config.devServer);
return promise;
}
그런 다음devServer
(동 기적으로) ...
자세한 내용은 github에서이 문제를 참조하십시오.
APP_INITIALIZER
! 마지막으로 & # 39; 초기화 전에 앱을 일시 중지하는 방법 & # 39; AngularJS 시대의 질문에 공정한 대답이 있습니다. - estusservice.load()
~로부터APP_INITIALIZER
공급자, 항상 정의되지 않은 반환합니다. 나는load
메소드는GlobalService
이 모듈은 애플리케이션로드 프로세스가 끝날 때로드되는 것 같습니다. - snaphuman