javascript - javascript,异步,等待:无法将值提取到类变量中
问题描述
tldr如何从一个类中设置一个类变量Promise
我在敲我的头,因为我太笨了,无法使用async/await
javascript。当然有很多示例和博客文章,但它们只是then'
将结果放入console.log
我不需要的内容中。
我的用例非常简单,我想使用 fetch 从 json 加载翻译(如果尚未加载),然后使用 function 返回翻译后的值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 加载数据然后使用这些数据的正确方法是什么?
第二次编辑:
事实上,我只想创建一个 TranslationMixin 并加载一次翻译。然后在我的页面中(我正在玩 Polymer)我想使用return html '<div>${this.translate("de-De","propertyX"}<div>'
,这就是为什么我不想要 Promise 而只想要普通字符串。事实上,翻译应该在构建过程中加载并完成。但是作为fetch
回报,Promise
我被困住了Promise
并且无法获得价值(#sigh)。所以可能我只坚持常规XMLHttpRequest
......
解决方案
您需要等到翻译完成。最简单的方法是也创建translate
一个异步函数。这将返回一个承诺,您可以在以下位置获得翻译then()
:
class Test {
constructor() {
}
/**
* Loads translations
*/
async _loadTranslations() {
console.log("Loading tanslations");
this.translation = "some translation"
return this.translation;
};
async translate(key, language) {
if(!this.translation){
return this._loadTranslations().then(data =>{
console.log("data is loaded!", data);
return data;});
}
return this.translation;
}
}
new Test().translate("MEGA_MENU_CMD","de-DE")
.then(translate => console.log(translate))
推荐阅读
- sql - 如何将多列合并为一列?
- amazon-web-services - 通过角色连接到 2 个不同 AWS 账户的资源
- python - 将长格式转换为宽数据帧
- swift - 从自定义 TableViewCell 子类中的 TextField 获取并传递文本
- html - 如何使用 Flexbox 填充下面的剩余空间而不增加其他元素
- spring - 存储库错误 - 当前正在创建的 FactoryBean 从 getObject 返回 null。在 Atomikos 分布式事务中
- php - 如何从 laravel 调用现有的 AWS Lambda 函数?
- javascript - 使用公式计算将多少项插入到数组中
- excel - 将 1 放入第一个值,将 0 放入其余值的公式。重复数据集
- python - 如何从 Python 中的生成器打印参数?