【问题标题】:Issue in handling async function called by another function处理由另一个函数调用的异步函数时出现问题
【发布时间】:2019-03-13 14:47:02
【问题描述】:

简单来说,我有 2 个函数 A,B

A 是异步函数,需要时间来请求一些东西然后准备好响应返回

B 从 A 获取输出

这是我的代码

async function A()
{
    axios.get('API_ENDPOINT_URL').then(async function (rates) {
        return new Promise((resolve , reject) => {
            resolve(rates.data.data);
        });
    });
}

async function B(id)
{
    var results = A();
    console.log(results); // this output Promise { undefined }
}

如何解决这个问题?

【问题讨论】:

    标签: javascript ajax promise async-await


    【解决方案1】:
     var results = await A();
    

    只是等待 A 的执行。而且还要修复 A 本身,这完全是滥用承诺:

     async function A() {
      const rates = await axios.get('API_ENDPOINT_URL')
      return  rates.data.data;
    }
    

    【讨论】:

    • 没有 await ,它输出 Promise { undefined } with await ,它输出 undefined
    • @27mdmo7sn 这意味着rates.data.data 是未定义的,你的意思是rates.data 吗?
    • @keith 可能是这样,或者只是因为他在我的编辑之前发表了评论,并且仍然引用了他的代码,该代码没有从 A 中返回任何内容
    • 是的@JonasWilms,你是对的,你的答案对我有用,不使用承诺会更简单/容易
    • 我的意思是不声明一个新的 Promise 并返回 reject 或 resolve 很简单,这有点不容易
    【解决方案2】:

    您的函数 A 返回一个承诺,因此您可以使用 await A() 或 A().then(results => console.log(results))

    【讨论】:

      【解决方案3】:

      你已经打电话给 .then 一个承诺,像这样:

      function A()
      {
        return new Promise((resolve , reject) => {
            resolve("test");
        });
      }
      
      function B()
      {
        A().then(result=>console.log(result));
      }
      
      B();

      【讨论】:

        【解决方案4】:

        实际上没有特别的原因需要async 或await。您也可以只从 .then() 处理程序返回一个值,该处理程序将在任何支持 axios 的环境中工作(不需要 async/await 支持):

        function A() {
            return axios.get('API_ENDPOINT_URL').then(function (rates) {
                return rates.data.data;
            });
        }
        
        // usage
        A().then(result => {
           console.log(result);
        }).catch(err => {
           console.log(err);
        });
        

        如果您没有意识到,这个版本和上面使用 await 的版本都返回相同的东西 - 一个解析为 rates.data.data 的承诺或以 axios 错误拒绝。

        从.then() 处理程序返回一个值会将承诺链的解析值更改为您返回的值。

        除非该值也是一个 Promise,在这种情况下,该 Promise 被添加到链中,并且该链的已解决值成为您返回的新 Promise 的已解决值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-15
          • 1970-01-01
          • 2021-08-07
          • 2021-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多