如何评估 if 语句中的承诺
How to evaluate a promise in an if statement
我试图在 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:
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')
返回的对象不是空对象,所以我的 if(storage.get('lang'))
计算结果为真.
是否有人使用过@ionic/storage 模块并遇到过这个问题,或者有人有解决方案吗?谢谢!
虽然我目前没有能力测试代码,但我会冒险回答。
您要查找的流程似乎是:
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.
所以您不 "if" 在顶层。你只是得到了承诺,"then" 它,然后在 then 块内,检查值并做你的事情。
很多人 运行 通过 promises 和 observables 参与其中。 "How do I check the value, if the value isn't available at the top level?"回答:你不知道。您只需 运行 订阅或 "then",然后在该块内检查并 运行 您的情况。
所以快速尝试一些可能的 运行 代码:
this.storage.get("lang").then(lang => {
if ( lang ) {
this.translate.use(lang);
}
});
你不能那样使用承诺。
if (somePromise)
将始终评估为 true,因为它将 return 一个承诺,而不是已解决的值。
您必须使用
获取已解析的值
somePromise.then(value => {
if (value) {
// use value
}
}
您当前的实施存在一些问题。
- 您多次调用
this.storage.get
,这是多余的。
this.storage.get
returns 一个 Promise 但您在 if
条件中寻找的是 promise
. 的解析值
您可以使用 async
await
语法而不是 .then
语法来使代码在解决问题时更具可读性:
async yourFunction() {
const lang = await this.storage.get("lang")
if (lang) this.translate.use(lang);
}
确保像我所做的那样在 async
函数中定义此代码,否则它会抛出错误。
我试图在 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:
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')
返回的对象不是空对象,所以我的 if(storage.get('lang'))
计算结果为真.
是否有人使用过@ionic/storage 模块并遇到过这个问题,或者有人有解决方案吗?谢谢!
虽然我目前没有能力测试代码,但我会冒险回答。
您要查找的流程似乎是:
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.
所以您不 "if" 在顶层。你只是得到了承诺,"then" 它,然后在 then 块内,检查值并做你的事情。
很多人 运行 通过 promises 和 observables 参与其中。 "How do I check the value, if the value isn't available at the top level?"回答:你不知道。您只需 运行 订阅或 "then",然后在该块内检查并 运行 您的情况。
所以快速尝试一些可能的 运行 代码:
this.storage.get("lang").then(lang => {
if ( lang ) {
this.translate.use(lang);
}
});
你不能那样使用承诺。
if (somePromise)
将始终评估为 true,因为它将 return 一个承诺,而不是已解决的值。
您必须使用
获取已解析的值somePromise.then(value => {
if (value) {
// use value
}
}
您当前的实施存在一些问题。
- 您多次调用
this.storage.get
,这是多余的。 this.storage.get
returns 一个 Promise 但您在if
条件中寻找的是promise
. 的解析值
您可以使用 async
await
语法而不是 .then
语法来使代码在解决问题时更具可读性:
async yourFunction() {
const lang = await this.storage.get("lang")
if (lang) this.translate.use(lang);
}
确保像我所做的那样在 async
函数中定义此代码,否则它会抛出错误。