2016-08-06 3 views
1

У меня проблема с вызовом Angular 2/web service. Моя идея состоит в том, чтобы создать услугу как инъекционную, чтобы использовать ее внутри компонента, который должен быть локализован (в этих терминах используются разные языки). Мои строки хранятся в базе данных, и мне нужно сделать это, чтобы получить их с помощью веб-службы и сохранить их в ассоциативном массиве. Затем укажите способ получения значения с помощью ключа. Вот мой пример кода:Угловые 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; 
    } 
} 

Теперь то, что я не могу решить: конструктор вызывает веб-службы и заканчивается сразу, не ждать ответа. Поэтому, когда я использую эту инъекционную услугу в своем компоненте, это должно быть отображено на правильном языке, строки не загружаются во время рендеринга. Если быть точным, когда я устанавливаю точку останова на вызов .map(), он никогда не попадает. Это не худшая проблема, я могу сделать это с помощью обещания, поскольку я делаю это в других местах приложения. Обещания работают хорошо для меня, когда мне нужно позвонить в веб-службу. Проблема в том, что она не ждет повтора с сервера. Я проверил другие вопросы и ответы, такие как

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

, но это не помогает мне в любом случае. Я не могу заставить приложение ждать, пока ответ не будет возвращен. Есть ли кто-нибудь, кто может сказать мне, что я делаю неправильно?

+0

Просто не существует способа заставить приложение ждать возврата асинхронного вызова. Что вы можете сделать, так это выполнить код при поступлении ответа. Вот что демонстрируют ответы на поставленный вами вопрос. –

+0

спасибо за не очень хорошие новости :) так что, у вас есть что предложить, чтобы сделать приложение локализуемым с помощью веб-службы? – Martin

+0

Как следует из ответов на связанный вопрос. Если вы хотите использовать значения с сервера, тогда укажите значения с помощью «Наблюдаемого» и получите доступ к ним, подписавшись на наблюдаемый. –

ответ

-4

Вы ищете Observables они рок!