【问题标题】:async function without await keyword inside内部没有 await 关键字的异步函数
【发布时间】:2020-03-23 18:24:36
【问题描述】:

我一直认为异步函数内部需要包含“await”关键字,例如:

async function doTask() {
 let total = await CustomFunction(values);
 console.log(`Main Total: ${total}`);
}
doTask();

但我也看到一些类似的定义异步函数而没有等待:

GetData = async ( method, url, params) =>
{
    Axios.request({
        method, url, params
    });
}

那么在没有“await”关键字的函数前面添加 async 关键字有什么意义呢?

【问题讨论】:

  • 因为你现在可以await那个函数了。不可能让每个异步函数都包含await,因为它们必须await something。如果每个人都只是awaits,因此是async,那么他们都使用await 的原始功能在哪里?
  • stackoverflow.com/questions/45594596/… 重复,此处发布的所有答案均从此处复制
  • 这能回答你的问题吗? Async function without await in Javascript
  • 编写此代码的人不知道 async 的真正作用也并非不可能。

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

在您的示例中,这可能是一个错误;我猜Axios.request前面应该有一个return await

但总的来说,除非调用者明确地只接受返回 Promise 的函数,否则声明无等待函数 async 是没有意义的。

【讨论】:

    【解决方案2】:

    简单来说,如果你在任何异步函数前使用await,它将一直等待请求成功。

    在你的例子中:

    async function doTask() {
     let total = await CustomFunction(values);
     console.log(`Main Total: ${total}`);
     return total;
    }
    doTask();
    

    在上面的例子中,如果你调用doTask() 那么total 将包含请求的结果。但是如果你不使用 await 那么 total 可能不包含请求的结果。

    async function doTask() {
     let total = CustomFunction(values);
     console.log(`Main Total: ${total}`);
     return total;
    }
    doTask();
    

    现在,如果您调用 doTask(),那么它可能会返回 undefinednull 而不是实际请求。

    【讨论】:

      【解决方案3】:

      将函数标记为异步但内部没有等待是一种不好的做法,因为它会强制您的转译工具(babel/typescript)向生成的包添加一些额外的代码。
      使用打字稿查看example,尝试删除/添加异步字。
      但正如 Juhil Somaiya 所说,没有 await 的代码将同步工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        相关资源
        最近更新 更多