关于app.use中的async

关于app.use中的async

老师您好,我想问下app.use中使用的中间件函数是不是既可以加async也可以不加?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

不是的,是必须加~~~

不加的话,就不会完全按照洋葱模型来执行我们的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


结论:

  1. 为了保证洋葱模型:因为大多数中间件,别人在书写的时候,都使用了async/await的异步方式,所以我们在写的时候,不能不加,否则就会出现不按照既定方式(洋葱模型)的方法执行我们的应用了。

  2. 为了保证执行效率:为了保证我们的应用nodejs的性能及远离回调黑洞,使用async/await而不是Promise + then的玩法,这样我们的应用就不会阻塞进程(异步执行),提高执行的效率。



  • qq_那些荒废流年 提问者 #1
    老师,您说 “如果没有这个await/async,那么程序执行的时候,就不会按照异步来进行执行,这个时候就会阻塞进程;”这里的就会阻塞进程我不是很理解,在您举得例子中,不加await/async,阻塞的是哪里的进程?
    2019-10-16 13:25:13
  • Brian 回复 提问者 qq_那些荒废流年 #2
    你没有从打印的结果是看出区别吗?自己有没有跑过这两个应用? 应用2的,fn1是阻塞了fn2的的进程的,先执行了back fn1,这明显不是洋葱模型啊。 洋葱模型应该是先去执行back fn2,再去执行back fn1
    2019-10-16 15:28:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师