首页 > 解决方案 > Express 中的异步路由功能和异步中间件是否阻塞了执行过程(2021 年)?

问题描述

我知道 Express 允许在路由和中间件中执行异步函数,但这是正确的吗?我阅读了文档,它指定不应该分配任何路由或异步中间件,今天,目前,Express 是否支持异步功能?它会阻止执行过程吗?o 当前异步函数不会阻塞执行过程?,

例如,如果我放置在异步路由中,并且如果同时在该路由中发出请求,它们是否并行解决?即:

在此处输入图像描述

或者在分配异步路由的时候,这些请求会一个接一个的解决吗?,也就是:

在此处输入图像描述

这就是我所说的“阻止执行过程”的意思,因为如果一个失败,其他请求是否处于未决状态?还是我误会了?

我希望你能帮助我。

标签: expressasync-awaites6-promiseexpress-router

解决方案


您可以使用asyncExpress 很好地使用函数,但它们是否阻塞与它们是否是无关的async,而与函数中的代码所做的一切有关。如果它启动一个异步操作然后返回,那么它不会阻塞。但是,如果它在返回之前执行了一堆耗时的同步代码,那将会阻塞。

如果getDBInfo()是异步的并返回一个在完成时解析的承诺,那么您的示例将同时运行三个数据库操作。它们是否真正并行运行完全取决于您的数据库实现,但您在此处显示的代码允许它们在数据库实现的情况下并行运行。

Javascript 执行的单线程将运行对 的第一次调用getDBInfo(),该 DB 请求将被启动并立即返回一个 Promise。然后,它将命中await并暂停包含函数的执行。这将允许事件循环开始处理第二个请求,它也会这样做。当它点击 时await,它将暂停包含函数的执行,并允许事件循环处理第三个请求。然后,一段时间后,其中一个 DB 调用将完成(它可以是三个中的任何一个),这将解决它的承诺,这将取消暂停函数并发送响应。然后,其他两个数据库调用将一个接一个地完成并发送它们的响应。


推荐阅读