表达与高雅的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<>强连接的执行流程强>
通常我们都说连接的中间件模型是线性的,也就是一个一个往下执行的,如下图:
这么说当然是没错的,但是当我们执行下面代码的时候可能会有那么一点小小的困惑:
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。结束之后,我们的代码还是要继续往下走的,可以这么说连接的中间件其实也是洋葱形的,但是因为作为同步代码,一般不回这么做罢了,那么上面我们可以重现描述一下连接的中间件模型了:
<强>高雅的执行流程强>
同样我们再高雅源码分析,也是说过高雅的中间件模型:洋葱形
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;了,也就是说