tldr Как мне установить переменную класса из Promise
Я бьюсь головой, потому что я слишком глуп, чтобы использовать async/await
с javascript. Конечно, есть множество примеров и постов в блогах, но они '1007 * приводят результаты только в console.log
, что мне не нужно.
Мой вариант использования очень прост, я хочу загрузить переводы из json, используя fetch (если они еще не были загружены), а затем вернуть переведенное значение с помощью функции translate
.
Я подумал, что если я использую then
, то выполнение приостанавливается до тех пор, пока Promise
не разрешится или не произойдет сбой.
class Test {
constructor() {
}
/**
* Loads translations
*/
async _loadTranslations() {
console.log("Loading tanslations");
let response = await fetch('data.json');
let json = await response.json();
return json;
};
translate(key, language) {
if(!this.translation){
this._loadTranslations().then(data =>{
console.log("data is loaded!", data);
this.translation = data;});
}
return this.translations[language][key];
}
}
console.log("translation",new Test().translate("MEGA_MENU_CMD","de-DE"))
Но он всегда записывает translation undefined
.
Я не хочу что-то вроде
new Test()._loadTranslations().then(r => console.log("result",r))
, поскольку я хочу использовать функцию перевода в шаблонах, и я не хочу использовать .then
во всех моих шаблонах.
Редактировать Я не понимаю, как я могу использовать fetch
для получения данных из API и установки их в качестве модели класса. then
s и callback
s, по моему мнению, делают разные вещи. Или как правильно создать экземпляр класса, загрузить данные из API и затем работать с этими данными?
2-е редактирование :
На самом деле, я просто хочу создать TranslationMixin и загрузить переводы один раз. Затем на своей странице (я играю с Polymer) я хочу использовать return html '<div>${this.translate("de-De","propertyX"}<div>'
, и поэтому я не хочу обещание, а просто простую строку. На самом деле перевод должен быть загружен во время строительства и сделано. Но когда fetch
возвращает Promise
, я застрял с Promise
и не смог получить значение (#sigh). Так что, вероятно, я придерживаюсь обычного XMLHttpRequest
...