我试图在if语句的评估部分中获取promise的值。 我的代码:
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: [] }
如果我运行代码,则会收到错误消息:
error: "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Error</title>\n</head>\n<body>\n<pre>Cannot GET /assets/i18n/null.json</pre>\n</body>\n</html>\n"
headers: Object { normalizedNames: Map(0), lazyUpdate: null, lazyInit: lazyInit()
}
message: "Http failure response for http://localhost:8100/assets/i18n/null.json: 404 Not Found"
name: "HttpErrorResponse"
ok: false
status: 404
statusText: "Not Found"
url: "http://localhost:8100/assets/i18n/null.json"
<prototype>: Object { constructor: HttpErrorResponse()
}
所以我假设问题是,尽管storage.get('lang')
返回__zone_symbol__value: null
,但storage.get('lang')
返回的Object不是一个空对象,所以我的if(storage.get('lang'))
计算为true。 / p>
有人曾经使用@ ionic / storage模块并遇到此问题,还是有人有解决方案?谢谢!
答案 0 :(得分:1)
尽管现在我没有能力测试代码,但我会冒险回答。
您正在寻找的流程似乎是:
When this promise,
Produces a value,
Do Something if it isn't null.
要做到这一点,您的流程必须是:
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.
因此,您不要在顶层“如果”。您只要得到承诺,然后“兑现”它,然后在then块中检查价值并做您的事情即可。
很多人都怀着承诺和可观察到的东西。 “如果顶级值不可用,如何检查该值?”答:你不知道。您只需运行订阅或“然后”,然后在该块中检查并运行您的条件。
因此,可以快速尝试一些可能运行的代码:
this.storage.get("lang").then(lang => {
if ( lang ) {
this.translate.use(lang);
}
});
答案 1 :(得分:0)
你不能使用那样的诺言。
if (somePromise)
将始终评估为true,因为它将返回承诺而不是已解决的值。
您必须使用
获取已解析的值somePromise.then(value => {
if (value) {
// use value
}
}
答案 2 :(得分:0)
您当前的实现存在一些问题。
this.storage.get
,这是多余的。this.storage.get
返回一个Promise,但是您在if
条件下寻找的是promise
的可解析值。您可以使用async
await
语法代替.then
语法,以使代码在解决问题时更具可读性:
async yourFunction() {
const lang = await this.storage.get("lang")
if (lang) this.translate.use(lang);
}
请确保像我一样在async
函数中定义此代码,否则它将引发错误。