【问题标题】:How to call an async function inside an if statement?如何在 if 语句中调用异步函数?
【发布时间】:2023-01-08 00:59:33
【问题描述】:

To keep variables in background.js in chrome extension 我需要重新初始化一些全局变量,遇到了一些困难。

这是我想说明问题的代码(fiddle):

var temp = null; 

function someTimeConsumingThing() {
  return new Promise(function(resolve,reject) {
    setTimeout(resolve, 2000);
    temp = 10;
  })
}

async function a(){
  if(temp==null){
    await someTimeConsumingThing();
  }
  return temp
}

function b(){
  let localTemp = a();
  console.log(localTemp);
}

b();

在上面的代码 sn-p 中,temp 变量有时会为 null,为了确保 temp 不为 null,我应该调用一个异步函数 someTimeConsumingThing。正如我们所见,console.log 输出了一个 Promise 而不是 10;如果我在 a() 之前添加 await 就会出错:

未捕获的语法错误:await 仅在异步函数和模块的顶层主体中有效”

我该如何解决这个问题?我在这里阅读了许多相关但无用的答案,我不知道如何优化我的搜索输入以获得最相关的问题。这个问题对于 JS 专家来说是非常幼稚的,而且这个网站上肯定有可用的答案。

【问题讨论】:

  • 你为什么(含蓄地)反对将b()也标记为async,这样你就可以成功地await调用a()

标签: javascript asynchronous async-await promise


【解决方案1】:

调用异步函数并需要该函数结果的函数本身(根据定义)必须是异步的。

只需更改b,使其成为一个异步函数:

async function b(){
  let localTemp = await a();
  console.log(localTemp);
}

【讨论】:

    【解决方案2】:

    你在调用a()时忘记使用await,这意味着你打印了返回的promise,而不是a()的异步结果。因此,包含函数也需要是async,因为它包含一个await调用。

    请注意,将 someTimeConsumingThing 函数标记为异步是一种很好的做法,因为它会返回一个 Promise。

    另请注意,您的 someTimeConsumingThing 函数会立即将 temp 设置为 10,然后延迟直到返回。我重写了它,所以它只在延迟完成后将温度设置为 10。

    let temp = null;
    
    async function someTimeConsumingThing() {
      return new Promise(resolve => {
        setTimeout(()=>{
          temp = 10;
          resolve();
        }, 2000);
      })
    }
    
    async function a(){
      if(temp==null){
        await someTimeConsumingThing();
      }
      return temp;
    }
    
    async function b(){
      let localTemp = await a();
      console.log(localTemp);
    }
    
    b();

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多