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())
} 
}

私は何をしたいのですか?明らかに:バックエンドサーバーのURLに関する情報をJSONファイルに保存したい - グローバルサービスはサーバーを返す必要があり、検索サービスのどの方法でも使用できるようにする必要があります。

問題は:DoGeneralSearch()メソッドは、グローバルサービスがタスクを解決してJSONファイルを読み込んで結果を返すことができるようになる前に実行されます。ですから、this.server = subscriber {isUnsubscribed:false、syncErrorValue:null、syncErrorThrown:false、syncErrorThrowable:false、isStopped:false ...}という結果が返されます。

私は、DoGeneralSearchメソッドがthis.server変数を解決した直後に実行されるのを防ぐ方法を見つける必要があります。

助言がありますか ?

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; AngularJS日からの質問は公平な答えを得ました。 - estus
  • こんにちは、私はこのアプローチを行っていますが、約束をデバッグするときservice.load()からAPP_INITIALIZERプロバイダ、常にundefinedを返します。私は、loadメソッドは、GlobalServiceこのモジュールはアプリケーションのロードプロセスの最後にロードされているようです。 - snaphuman
  • また、@nglibs \ configあなたのプロジェクトでは、アプリケーションの初期化中に解決されたbackend.jsonから必要な設定データを提供します - Burak Tasci
  • APP_INITIALIZERサービスでは、私はさまざまなサービスから2つのHTTP呼び出しを行う必要があります。初期化する方法はありますか - Vignesh

リンクされた質問


関連する質問

最近の質問