2

나는이 시나리오를 가지고있다.

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 메소드가 실행되지 않도록하는 방법을 찾아야합니다.

어떤 제안?

1 답변


7

응용 프로그램 시작시 이러한 힌트를 미리로드 할 수 있다고 생각합니다. 이를 위해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 시대의 질문에 공정한 대답이 있습니다. - estus
  • 안녕하세요, 나는이 접근법을했지만 약속을 디버깅 할 때service.load()~로부터APP_INITIALIZER공급자, 항상 정의되지 않은 반환합니다. 나는load메소드는GlobalService이 모듈은 애플리케이션로드 프로세스가 끝날 때로드되는 것 같습니다. - snaphuman
  • 또한,@nglibs \ config귀하의 프로젝트에서 응용 프로그램 활성화 과정에서 해결 된 backend.json의 필수 구성 데이터를 제공합니다 - Burak Tasci
  • APP_INITIALIZER 서비스에서는 다양한 서비스에서 두 개의 HTTP 호출을해야합니다. 어떤 방법으로 초기화 할 수 있습니까? - Vignesh

연결된 질문


관련된 질문

최근 질문