如何在if语句中评估promise

时间:2018-11-20 14:06:46

标签: angular ionic4

我试图在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模块并遇到此问题,还是有人有解决方案?谢谢!

3 个答案:

答案 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)

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

  1. 您要多次拨打this.storage.get,这是多余的。
  2. 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函数中定义此代码,否则它将引发错误。