【问题标题】:Are async routing functions and asynchronous middleware in Express blocking the execution process (in 2021)?Express 中的异步路由功能和异步中间件是否阻塞了执行过程(2021 年)?
【发布时间】:2021-12-03 06:28:11
【问题描述】:

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

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

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

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

我希望你能帮助我。

【问题讨论】:

    标签: express async-await es6-promise express-router


    【解决方案1】:

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

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

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

    【讨论】:

    • 我用图片和例子更新问题的内容,希望你能帮助我。
    • @Grizzly - 我的答案中添加了更多信息。
    • 啊!现在我明白了,但更清楚的是,当你说:“函数返回”时,你的意思是什么?发送响应?,也就是说,如果我这样做:app.get('/', await (req, res) => { res.json ({ msg: 'ok' }) });,函数“返回一些东西”(返回一个答案),这就是你的意思吗?因为这不会阻塞进程,对吧?
    • @Grizzly - 好吧,我的回答并没有说出你引用的内容:“函数返回”在任何地方,所以我不太确定你在问什么。这个app.get('/', await (req, res) => { ...}); 是不正确的。你会尝试await 一个没有用的函数引用。
    • 对不起,显然我错了,我英语不太流利,也许我翻译错了,还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 2018-09-04
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多