express - Express 中的异步路由功能和异步中间件是否阻塞了执行过程(2021 年)?
问题描述
我知道 Express 允许在路由和中间件中执行异步函数,但这是正确的吗?我阅读了文档,它指定不应该分配任何路由或异步中间件,今天,目前,Express 是否支持异步功能?它会阻止执行过程吗?o 当前异步函数不会阻塞执行过程?,
例如,如果我放置在异步路由中,并且如果同时在该路由中发出请求,它们是否并行解决?即:
或者在分配异步路由的时候,这些请求会一个接一个的解决吗?,也就是:
这就是我所说的“阻止执行过程”的意思,因为如果一个失败,其他请求是否处于未决状态?还是我误会了?
我希望你能帮助我。
解决方案
您可以使用async
Express 很好地使用函数,但它们是否阻塞与它们是否是无关的async
,而与函数中的代码所做的一切有关。如果它启动一个异步操作然后返回,那么它不会阻塞。但是,如果它在返回之前执行了一堆耗时的同步代码,那将会阻塞。
如果getDBInfo()
是异步的并返回一个在完成时解析的承诺,那么您的示例将同时运行三个数据库操作。它们是否真正并行运行完全取决于您的数据库实现,但您在此处显示的代码允许它们在数据库实现的情况下并行运行。
Javascript 执行的单线程将运行对 的第一次调用getDBInfo()
,该 DB 请求将被启动并立即返回一个 Promise。然后,它将命中await
并暂停包含函数的执行。这将允许事件循环开始处理第二个请求,它也会这样做。当它点击 时await
,它将暂停包含函数的执行,并允许事件循环处理第三个请求。然后,一段时间后,其中一个 DB 调用将完成(它可以是三个中的任何一个),这将解决它的承诺,这将取消暂停函数并发送响应。然后,其他两个数据库调用将一个接一个地完成并发送它们的响应。
推荐阅读
- python-3.x - Windows Defender 将完全无害的代码定义为具有潜在危险的软件
- php - WooCommerce 4 中自定义订单状态的自定义标题和主题电子邮件通知
- laravel - 调用未定义的方法 Illuminate\Database\Query\Builder::createToken()
- oracle - 如何分组和加入第二个表
- dynamic - 创建了 Sitefinity 动态模块。内容下拉菜单中缺少输入数据
- python - 将 Pandas df 集成为纸浆/pyomo 中的约束
- amazon-web-services - 从 EndPoint LocalStorage AWS Cognito 获取访问令牌
- ionic-framework - 更新离子列表时如何防止自动滚动到顶部
- json - 读取本地 json 文件 - Ionic - 在浏览器中工作但不在实际设备中
- elasticsearch - 弹性搜索查询在属性值中添加 30 天