如何评估 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: nullstorage.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
    }
}

您当前的实施存在一些问题。

  1. 您多次调用 this.storage.get,这是多余的。
  2. this.storage.get returns 一个 Promise 但您在 if 条件中寻找的是 promise.
  3. 的解析值

您可以使用 async await 语法而不是 .then 语法来使代码在解决问题时更具可读性:

async yourFunction() {
  const lang = await this.storage.get("lang")
  if (lang) this.translate.use(lang); 
}

确保像我所做的那样在 async 函数中定义此代码,否则它会抛出错误。