javascript - 为什么我必须将 async 关键字放在具有 await 关键字的函数中?

标签 javascript async-await babeljs ecmascript-next

我只想等待一个进程完成,不想让函数异步。
请看下面的代码。
我必须使 getUserList 异步,因为函数中有一个 await 关键字。因此,我还必须编写类似“await UsersService.getUserList”的代码来执行该方法,而且我还必须使父函数异步。那不是我想做的。

import xr from 'xr' //a package for http requests

class UsersService {

  static async getUserList() {
    const res = await xr.get('http://localhost/api/users')
    return res.data
  }

}

export default UsersService

import UsersService from './UsersService'

class SomeClass {

  async someFunction() { //async again!!
    const users = await UsersService.getUserList() //await again!!
  }

}

最佳答案

这是设计选择吗?

这是因为 JavaScript 的同步特性。如果你想让一个函数同步运行一个异步命令,它会阻塞整个程序,这是非常不可取的,如果它是客户端就很糟糕,如果它是服务器端就很糟糕。出于这个原因,存在 async 函数。这些功能从正常流程中取出,这就是 await 起作用的原因。

为什么?

另一个原因是 await+async 是 promises 的语法糖。 Promises 是异步的,你无法阻止它。这意味着 await 不会使异步函数同步,它只是暂停 await 函数的其余部分,直到它完成。如果它确实阻塞了整个事件循环,想象一下如果您想创建一个可以在客户端之间发送数据的应用程序。每次发出异步请求时,您的整个服务器应用程序都会挂起,而不是仅仅使单个请求异步。

所以这样想:

您不是在使异步函数同步,而是在使程序的其余部分异步以应对它。

因此,与其将 async 视为 await 的要求,不如将它们视为组合(async+await) 因为这就是它们的基本工作方式。如果您想了解有关异步和等待的更多信息,我强烈建议您阅读我的 blog article对此进行了深入研究。

关于javascript - 为什么我必须将 async 关键字放在具有 await 关键字的函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38320610/

相关文章:

javascript - Three.js:我可以只在纹理添加或鼠标移动等少数情况下更新 WebGL 中的 3D 对象吗?

javascript - 语法错误: 'import' and 'export' may appear only with 'sourceType: module' - Gulp

javascript - 在保留图像的同时在 HTML5 Canvas 中绘制图像

javascript - Concat 音频文件然后调用创建文件

c# - "awaitable"任务的严格定义是什么?

javascript - 从递归函数expressjs返回空数组?

javascript - Babel 没有将导入的 node_modules 转译为 ES5 - 包括 ES2015 语法

javascript - React - 模块解析失败 : Unexpected Token. 您可能需要适当的加载程序来处理此文件类型

javascript - 如何将参数传递到 <span> 标记上的 jQuery.click() 函数?

javascript - 使用 jquery 或 ajax 将值传递到另一个页面