【问题标题】:Why do I need to async/await again in a different function?为什么我需要在不同的函数中再次异步/等待?
【发布时间】:2019-07-12 07:36:32
【问题描述】:

我很困惑为什么我需要在另一个函数中再次运行 async/await

例子

async function fetchData() {
   try {
        const result = await axios.get('http://example.com')
        return result

    } catch(err) {
       return err

     }
}


// and in another function I need to async await again 

// if I want to get the value of fetchData() 

// or else it will return pending promise object


function mapData() {
     const data = fetchData()
     console.log(data) // is a Pending Promise    
}

如果我想获取数据而不是 Promise 对象

async function mapData() {
     const data = await fetchData() // I still need to await?? 
     console.log(data) // real value
}

我认为如果我已经在 fetchData 函数中异步/等待它已经返回一个值而不是承诺,为什么我需要再次异步/等待以获取 mapData 函数中的实际数据?

【问题讨论】:

  • 一个异步函数总是返回一个promise,你不能神奇地让它同步。
  • 这里使用.then() 是更理想的选择。
  • 您可以从fetchData 中删除async/await,这是不必要的,因为axios 返回一个承诺
  • axios.get('http://example.com').then(function(data){ console.log(data); })

标签: javascript async-await


【解决方案1】:

async 函数将始终返回一个 Promise - 一旦异步函数到达其结束(在任何可能包含 awaits 之后)解析的 Promise。它不会神奇地使异步代码同步;异步函数的任何使用者也必须处理其异步性。

消费者中处理错误通常也更有意义。在这里,您似乎没有对 fetchData 中的错误做任何特别的事情,因此您可以立即返回 Promise,而不必在下游函数中 await 它:

function fetchData() {
   return axios.get('http://example.com');
}
async function mapData() {
     try {
       const data = await fetchData()
       console.log(data)
     } catch(e) {
       console.log('Something went wrong...');
       // handle failure of fetchData
     }
}

【讨论】:

    【解决方案2】:

    承诺与时间打交道。它们是最终将可用但尚未可用的值的包装器。在价值可用之前,您不会冻结整个应用程序。

    async/await 只是 Promises 的语法糖。它可以让你编写像

    这样的代码
    async function myFunction(){
      var id = await asyncMethod1();
      var value = await asyncMethod2(id);
      return syncMethod3(id, value);
    }
    

    而不是

    function myFunction(){
      return asyncMethod1().then(id => asyncMethod2(id).then(value => syncMethod3(id, value)));
    }
    

    但它不会改变这个东西在下面的工作方式。

    所以尽管syncMethod3 是同步的,但返回的值仍然依赖于异步计算的值foobar。这使得 myfunction 异步。

    每个调用myFunction 的函数都需要等到myFunction 计算出它的值,......等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 2022-01-16
      • 2021-01-04
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多