У меня проблема с вызовом 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?
, но это не помогает мне в любом случае. Я не могу заставить приложение ждать, пока ответ не будет возвращен. Есть ли кто-нибудь, кто может сказать мне, что я делаю неправильно?
Просто не существует способа заставить приложение ждать возврата асинхронного вызова. Что вы можете сделать, так это выполнить код при поступлении ответа. Вот что демонстрируют ответы на поставленный вами вопрос. –
спасибо за не очень хорошие новости :) так что, у вас есть что предложить, чтобы сделать приложение локализуемым с помощью веб-службы? – Martin
Как следует из ответов на связанный вопрос. Если вы хотите использовать значения с сервера, тогда укажите значения с помощью «Наблюдаемого» и получите доступ к ним, подписавшись на наблюдаемый. –