表达与高雅的区别是什么

  

表达与高雅的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<>强连接的执行流程
通常我们都说连接的中间件模型是线性的,也就是一个一个往下执行的,如下图:

表达与高雅的区别是什么

这么说当然是没错的,但是当我们执行下面代码的时候可能会有那么一点小小的困惑:

const  connect =,需要(& # 39;连接# 39;)   const  app =, connect ()   app.use (function  m1 (申请,,,,下一个),{   ,console.log (& # 39; m1 # 39;)   下(),   ,console.log (& # 39; m1 结束# 39;)   })   app.use (function  m2 (申请,,,,下一个),{   ,console.log (& # 39; m2 # 39;)   下(),   ,console.log (& # 39; m2 结束# 39;)   })   app.use (function  m3 (申请,,,,下一个),{   ,console.log (& # 39; m3 # 39;)   ,res.end(& # 39;你好# 39;)   })   app.listen (8080)

当我们访问http://127.0.0.1:8080的时候,控制台会打印如下:

m1   平方米   m3   m2 结束   m1 结束

这么个结果跟我们上面的模型似乎有点出入,不是说线性的吗,为什么下后面的代码还会继续执行吗?当然这个我们再之前已经有过结论了,有兴趣的可以详细瞧瞧,我们现在直接拿来结果,连接的中间件模型伪代码表示如下:

http.createServer (function (点播,res), {   ,m1 (点播,res), {   ,m2 (点播,res), {   ,m3 (点播,res), {}   ,}   ,}   })

可以看到就是一层一层嵌套的回调,那么再把我们之前有点疑问的代码简化一下:

http.createServer (function (点播,res), {   ,console.log (& # 39; m1 # 39;)   ,m1 (点播,res), {   ,console.log (& # 39; m2 # 39;)   ,m2 (点播,res), {   ,m3 (点播,res), {   ,console.log (& # 39; m3 # 39;)   ,res.end(& # 39;你好# 39;)   ,}   ,}   ,console.log (& # 39; m2 结束# 39;)   ,}   ,console.log (& # 39; m1 结束# 39;)   })

千万别被上面的回调绕晕了,就是很简单的回调函数,一切都解释的通了:即使res。结束之后,我们的代码还是要继续往下走的,可以这么说连接的中间件其实也是洋葱形的,但是因为作为同步代码,一般不回这么做罢了,那么上面我们可以重现描述一下连接的中间件模型了:

表达与高雅的区别是什么

<强>高雅的执行流程

同样我们再高雅源码分析,也是说过高雅的中间件模型:洋葱形

表达与高雅的区别是什么”> <br/> </p> <p>以下面代码为例:</p> <pre类= const  Koa =,需要(& # 39;洋槐# 39;)   const  app =, new 高雅()   app.use (async  function  m1  (ctx,,下一个),{   ,console.log (& # 39; m1 # 39;)   ,await  next ()   ,console.log (& # 39; m1 结束# 39;)   })   app.use (async  function  m2  (ctx,,下一个),{   ,console.log (& # 39; m2 # 39;)   ,await  next ()   ,console.log (& # 39; m2 结束# 39;)   })   app.use (async  function  m3  (ctx), {   ,console.log (& # 39; m3 # 39;)=,ctx.body  & # 39;你好# 39;   })   app.listen (8080)

访问服务,输出:

m1   平方米   m3   m2 结束   m1 结束

嗯貌似跟连接没差,别之前看过一篇文章,实验到这里得到了一个高雅和表达的中间件模型没差别的结论,包括我也是很迷惑,当然是有差别的,结论后面讲。同样这里直接拿出高雅中间件的简化模型:

Promise.resolve (async  m1  (), {   ,console.log (m1)   ,await  Promise.resolve (async  m2  (), {   ,console.log (m2)   ,await  Promise.resolve (async  m3  (), {   ,console.log (m3)=,ctx.body  & # 39; xxx # 39;   ,})   ,console.log (m2 结束)   ,})   ,console.log (m1 结束)   })

我们知道async/等待的作用是& # 39;同步化& # 39;异步操作(看上去如此,其实不是,但是我们不需要去管),那这里的承诺理所当然的被& # 39;同步& # 39;了,也就是说

表达与高雅的区别是什么