为什么我必须将 async 关键字添加到具有 wait 关键字的函数中?

2024-03-14

我只想等待进程完成,不想使函数异步。
请参阅下面的代码。
我必须使 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 works.

Why?

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

所以这样想吧:

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

所以与其想async的要求await,将它们视为一个组合(async+await)因为这就是它们的基本工作方式。如果您想了解有关异步和等待的更多信息,我强烈建议您阅读我的博客文章 http://web.archive.org/web/20160609080532/http://blog.vihan.org/index.php/2016/05/16/synchronously-async-ing/对此进行了深入探讨。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我必须将 async 关键字添加到具有 wait 关键字的函数中? 的相关文章

随机推荐

  • 如果双 SIM 卡槽之一的 SIM 卡发生更改,如何检索该卡的信息?

    我知道我们可以使用 TelephonyManager 类检索单张 Sim 卡的信息 但如何检索多张SIM卡的信息呢 假设我的手机丢失了 有人更换了其中一个插槽中的 SIM 卡 我如何接收 IMEI 号码 电话号码等信息 我只在更换 Sim
  • 无法将 [] 索引应用于“Array”类型的表达式

    对于下面的代码 我收到 无法将 索引应用于 数组 类型的表达式 目的是创建一个计算器模板 然后调用这些方法来运行各种操作 标记为 HERE 的区域出现错误 请帮忙 我是 C 编码的新手 因此 感谢所有帮助 如果有人也能向我解释这个问题 我希
  • Python 中的最大重量/最小成本二分匹配代码

    我正在寻找二分图中最大权重 最小成本匹配的Python代码 我一直在 NetworkX 中使用一般情况最大权重匹配代码 但发现它对于我的需求来说太慢了 这可能是因为通用算法速度较慢 而且 NetworkX 解决方案完全用 Python 实现
  • 使用 Heroku 部署 Flask

    我正在尝试将 Flask 应用程序部署到 Heroku 但是在推送代码时出现错误 2013 06 23T11 23 59 264600 00 00 heroku web 1 Error R10 Boot timeout gt Web pro
  • 如何使用vibed将文件加载到本地文件系统?

    我需要将数据从网络浏览器发送到本地文件系统 为了发送数据 我使用 Vue JS成分 https github com james2doyle vue file upload component
  • 从嵌入式 ZIP 存档中读取文件

    我有一个嵌入到较大文件中的 ZIP 存档 我知道存档在较大文件中的起始偏移量及其长度 是否有任何 Java 库可以让我直接读取存档中包含的文件 我正在思考ZipFile getInputStream http docs oracle com
  • Oracle 约束具有三列,但只有一行可以等于某个值

    这听起来可能很简单 也可能很简单 我有 3 列 一列带有常量字符串 名称 一列 状态 带有两个选项 外键 另一列 room id 是另一个表的父键 如何确保只设置一行相同名称的 ON 值 不能有多个具有相同名称的 ON 值的行 但可以有多个
  • Sqoop Hive 退出,状态为 1

    当我执行时 sqoop import connect jdbc mysql localhost testdb table test hive table test hive import m 1 我收到以下错误消息 13 04 21 16
  • 从 url 中去除域名(字符串)

    我正在像这样访问样式表集合 var css document styleSheets 0 它返回例如 http www mydomain com css main css 问题 如何剥离域名才能获得 css main css 这个正则表达式
  • 这些类和子类静态块何时执行(对于枚举)?

    我正在尝试定义一个基类 SubStatus 为枚举 什么时候static下面调用的块 如果它们是类而不是枚举 我相信它们会在调用类构造函数之后被调用 但因为他们是Enums 这些不是更像吗static课程开始 那么静态块可能是在容器加载静态
  • 如何将List<>写入parcel中

    public class Category implements Parcelable private int mCategoryId private List
  • tweepy 中的过滤

    我是新来的tweepy并且遇到了问题 我想下载带有特殊主题标签的推文 但似乎 stream filter track word1 word2 word3 在推文中查找这些单词 而不是在推文的主题标签中 如何过滤主题标签 您实际上可以根据您的
  • 根据用户的 uid 生成 Firestore 文档的文档 ID

    在我的聊天应用程序中 我在两个用户之间进行私人聊天 我打算使用这两个用户的 docId uid 设置聊天文档的 id 使其不依赖于它们组合的顺序 并且我可以使用用户的 uid 确定聊天文档的 docId 而不管其顺序如何uid 我知道 我也
  • 使用 Azure 服务总线进行结构化流处理

    如何为Azure服务总线设置Spark结构化流会话 我目前正在使用 azure databricks 作为服务总线主题订阅之一的消费者 我已经研究了几件事 但看到了周围的问题 https github com elastacloud ser
  • 如何在 Windows 上使用 Vim 编译 C++ 代码?

    首先 我安装Vim 文本编辑器 in Typical在这台 Windows 7 笔记本电脑上键入 我正在使用的用户是这台计算机上的管理员 但无法打开其中的文件 程序文件 使用 Vim 编写的位置 所以我改变我的 cd当前目录到我的 HOME
  • 如何在d3中加载geojson文件的geometryCollection

    我使用 Mapshapers 成功将英国地图 shapefile 转换为 geojson 但我无法在 d3 js 中加载此 geojson 请帮忙 脚本如下
  • 如何用onclick确认并调用函数

    我可以调用 JavaScript 函数吗return confirm 在 HTML onclick 事件中还是我需要执行包含确认和调用另一个函数的函数
  • 将现有文件夹放入存储库

    我认为直接在记事本中修改文件可能很危险 是时候进行一些适当的源代码控制了 我对源代码控制很陌生 我已在我的服务器上安装了 VisualSVN 服务器 并在我的客户端计算机上安装了 TortoiseSVN 我可以很好地创建新文件夹 检查它们等
  • 如何在Python中简单地计算时间序列的滚动/移动方差?

    我有一个简单的时间序列 我正在努力估计移动窗口内的方差 更具体地说 我无法弄清楚与实现滑动窗口函数的方式有关的一些问题 例如 当使用 NumPy 且窗口大小 20 时 def rolling window a window shape a
  • 为什么我必须将 async 关键字添加到具有 wait 关键字的函数中?

    我只想等待进程完成 不想使函数异步 请参阅下面的代码 我必须使 getUserList 异步 因为函数中有一个await 关键字 因此 我还必须编写 await UsersService getUserList 之类的内容来执行该方法 并且