私はこのシナリオを持っています。
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())
}
}
私は何をしたいのですか?明らかに:バックエンドサーバーのURLに関する情報をJSONファイルに保存したい - グローバルサービスはサーバーを返す必要があり、検索サービスのどの方法でも使用できるようにする必要があります。
問題は:DoGeneralSearch()メソッドは、グローバルサービスがタスクを解決してJSONファイルを読み込んで結果を返すことができるようになる前に実行されます。ですから、this.server = subscriber {isUnsubscribed:false、syncErrorValue:null、syncErrorThrown:false、syncErrorThrowable:false、isStopped:false ...}という結果が返されます。
私は、DoGeneralSearchメソッドがthis.server変数を解決した直後に実行されるのを防ぐ方法を見つける必要があります。
助言がありますか ?
私はあなたがアプリケーションの起動時にそのようなヒントをプリロードできると思います。このためには、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; AngularJS日からの質問は公平な答えを得ました。 - estusservice.load()
からAPP_INITIALIZER
プロバイダ、常にundefinedを返します。私は、load
メソッドは、GlobalService
このモジュールはアプリケーションのロードプロセスの最後にロードされているようです。 - snaphuman