Angular 如何评估if语句中的承诺
我试图在if语句的评估部分获得承诺的价值。 我的代码:Angular 如何评估if语句中的承诺,angular,ionic4,Angular,Ionic4,我试图在if语句的评估部分获得承诺的价值。 我的代码: if (this.storage.get("lang")) { this.storage.get("lang").then(lang => { this.translate.use(lang); }); 其目的是检查“lang”是否已设置,如果已设置,则获取“lang”。storage.get()方法来自@ionic/storage。如果我只记录this.storage.get('lang')我会得到这个JSON:
if (this.storage.get("lang")) {
this.storage.get("lang").then(lang => {
this.translate.use(lang);
});
其目的是检查“lang”是否已设置,如果已设置,则获取“lang”。storage.get()
方法来自@ionic/storage。如果我只记录this.storage.get('lang')
我会得到这个JSON:
Object { __zone_symbol__state: null, __zone_symbol__value: [] }
如果我运行代码,我会得到错误:
错误:“\n\n\n错误\n\n\n无法获取/assets/i18n/null.json\n\n\n”
标题:对象{normalizedNames:Map(0),lazyUpdate:null,lazyInit:lazyInit()
}
消息:“的Http失败响应”http://localhost:8100/assets/i18n/null.json: 404找不到“
名称:“HttpErrorResponse”
好:错
现状:404
statusText:“未找到”
url:“http://localhost:8100/assets/i18n/null.json"
:对象{构造函数:HttpErrorResponse()
}
因此,我假设问题是,尽管storage.get('lang')
返回\uuu zone\u symbol\uu value:null
,但是storage.get('lang')
返回的对象不是空对象,所以我的if(storage.get('lang')
计算结果为true
是否有人在使用@ionic/storage module时遇到过此问题,或者有人有解决方案?谢谢 我会冒险给出一个答案,尽管我现在没有能力测试代码 看起来您正在寻找的流程是:
Get The Promise,
"Then" to get the Value,
Check The Value,
Do Something if it isn't null.
为此,您的流程必须是:
If Promise // there will always be one!
Get Value,
And Do Something if it isn't null
所以你需要把你的逻辑颠倒过来
而不是:
Get Promise,
"Then" for Value (whatever it might be),
(Inside the Then block) If there is one, Do Something.
你必须去:
this.storage.get("lang").then(lang => {
if ( lang ) {
this.translate.use(lang);
}
});
所以你不会在最高层说“如果”。你只要得到承诺,“然后”它,然后在then块中,检查值并做你的事情
很多人都会带着承诺和可观察的东西遇到这种情况。“如果值在顶层不可用,如何检查该值?”回答:不可用。您只需运行订阅或“then”,然后在该块中检查并运行您的条件
因此,快速尝试一下可能会运行以下代码:
if (somePromise)
你不能用这样的承诺
somePromise.then(value => {
if (value) {
// use value
}
}
将始终计算为true,因为它将返回承诺,而不是解析值
您必须使用
async yourFunction() {
const lang = await this.storage.get("lang")
if (lang) this.translate.use(lang);
}
您当前的实现存在一些问题
this.storage.get
,这是多余的this.storage.get
返回一个承诺,但是如果条件是承诺的解析值,则在中查找
async
wait
语法而不是。然后
语法使代码在解决问题时更具可读性:
请确保在
async
函数中定义此代码,如我所做,否则将抛出错误。很乐意提供帮助,您可以将答案标记为已接受,以帮助其他人思考。这些答案是否解决了您的问题?如果是,请考虑将其中一个标记为解决方案。
somePromise.then(value => {
if (value) {
// use value
}
}
async yourFunction() {
const lang = await this.storage.get("lang")
if (lang) this.translate.use(lang);
}