Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何评估if语句中的承诺_Angular_Ionic4 - Fatal编程技术网

Angular 如何评估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语句的评估部分获得承诺的价值。 我的代码:

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); 
    }