2016-08-06 16 views
1

角度2 /ウェブサービスコールに問題があります。私の考えは、ローカライズする必要があるコンポーネント内で使用するための注入可能なサービスを作成することです(これらの用語では、異なる言語を使用します)。私の文字列はデータベースに格納されているので、Webサービスを使用して連想配列に格納する必要があります。次に、キーから値を取得するメソッドを提供します。ここに私のサンプルコードは次のとおりです。角度2は約束が解決するのを待つ

import {Injectable} from "@angular/core"; 
import { Http, Headers, RequestOptions, Response } from "@angular/http"; 

import "rxjs/add/operator/map"; 
import "rxjs/add/operator/share"; 

import myGlobals = require("./global"); 

@Injectable() 
export class LocalizationService { 
    private serviceUrl = myGlobals.urlPrefix + "api/public/Localization.asmx/GetStrings"; // url to web api 
    private observable: any; 
    private locString: {}; 
    private finished: boolean = false; 

    constructor(private http: Http) { 
     this.loadStrings("EN"); 
    } 

    private loadStrings(LanguageCode: string): void { 
     let body: string = JSON.stringify({ LanguageCode }); 
     let headers: Headers = new Headers({ 
      "Access-Control-Allow-Origin": "*", 
      "Content-Type": "application/json" 
     }); 
     let options: RequestOptions = new RequestOptions({ headers: headers }); 
     this.observable = this.http.post(this.serviceUrl, body, options) 
      .map(response => { 
       this.observable = null; 
       let responseText: string = response.text().substring(0, response.text().lastIndexOf("{")); 
       this.locString = JSON.parse(responseText).Data; 
       this.finished = true; 
      }) 
      .share(); 

     return; 
    } 

    public getStr(code: string): string { 
     let returnString: string; 
     try { 
      returnString = this.locString[code]; 
     } 
     catch (error) 
     { 
      returnString = ""; 
     } 

     return returnString; 
    } 
} 

今、私は解決することはできません何:コンストラクタは、Webサービスを呼び出すと、すぐに終了、それは応答を待ちません。だから私はコンポーネントでこの注入可能なサービスを使用すると、正しい言語でレンダリングする必要がありますが、文字列はレンダリング時にロードされません。正確には、私が.map()呼び出しにブレークポイントを設定すると、決してヒットしません。これは最悪の問題ではない、私はアプリの他の場所でそれをやっているように私は約束を使ってそれを行うことができます。私がWebサービスを呼び出す必要があるとき、私には約束がうまくいっています。問題は、サーバーからの再生を待つことではないということです。私は、このような

What is the correct way to share the result of an Angular 2 Http network call in RxJs 5?

などの他の質問と回答をチェックしましたが、これはどのような方法で私を助けていません。応答が返されるまで、アプリケーションを待機させることはできません。何が間違っているのか教えてくれる人はいますか?

+0

アプリケーションが非同期呼び出しを返すのを待たせる方法はありません。あなたができることは、応答が到着したときにコードを実行することです。これは、あなたがデモするためにリンクした質問に対する回答です。 –

+0

非常に良いニュースではありがたいことをありがとう:)ウェブサービスを使ってアプリケーションをローカライズできるようにする方法は何ですか? – Martin

+0

リンクされた質問への答えが示唆するように。サーバーからの値を使用する場合は、Observableを使用して値を提供し、Observableにサブスクライブすることによって値にアクセスします。 –

答えて

-4

あなたが探しているのはObservablesです。

関連する問題