关于app.use中的async
老师您好,我想问下app.use中使用的中间件函数是不是既可以加async也可以不加?
正在回答
不是的,是必须加~~~
不加的话,就不会完全按照洋葱模型来执行我们的koa应用了。
而且async/await可以“按照同步的方式来写异步的应用”,你可以对比一下如下的内容执行的效果:
// 应用
const fn1 = async (ctx, next) => {
console.log('in fn1')
await next()
console.log('back fn1')
}
const fn2 = async (ctx, next) => {
console.log('in fn2')
await next()
console.log('back fn2')
}
app.use(fn1)
app.use(fn2)
打印出来:
in fn1
in fn2
back fn2
back fn1
这个就是洋葱模型,先进的后出来,一层一层的。
下面再说说,如果没有这个await/async,那么程序执行的时候,就不会按照异步来进行执行,这个时候就会阻塞进程;而加了async的就是一个异步方法,就不会阻塞进程。
// 应用2:
const Koa = require('koa')
const app = new Koa()
const fn1 = (ctx, next) => {
console.log('in fn1')
next()
console.log('back fn1')
}
const fn2 = async (ctx, next) => {
console.log('in fn2')
await next()
console.log('back fn2')
}
app.use(fn1)
app.use(fn2)
app.listen(3000)
打印:
in fn1
in fn2
back fn1
back fn2
参考官方的例子:
https://github.com/koajs/koa#async-functions-node-v76
结论:
为了保证洋葱模型:因为大多数中间件,别人在书写的时候,都使用了async/await的异步方式,所以我们在写的时候,不能不加,否则就会出现不按照既定方式(洋葱模型)的方法执行我们的应用了。
为了保证执行效率:为了保证我们的应用nodejs的性能及远离回调黑洞,使用async/await而不是Promise + then的玩法,这样我们的应用就不会阻塞进程(异步执行),提高执行的效率。
相似问题
登录后可查看更多问答,登录/注册
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星