关于app.use中的async

来源:2-4 Koa中的Async&Await【原理篇】

qq_那些荒废流年

2019-10-15 18:58:12

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

写回答

1回答

Brian

2019-10-15

不是的,是必须加~~~

不加的话,就不会完全按照洋葱模型来执行我们的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的玩法,这样我们的应用就不会阻塞进程(异步执行),提高执行的效率。



0
hrian
回复
hq_那些荒废流年
h 你没有从打印的结果是看出区别吗?自己有没有跑过这两个应用? 应用2的,fn1是阻塞了fn2的的进程的,先执行了back fn1,这明显不是洋葱模型啊。 洋葱模型应该是先去执行back fn2,再去执行back fn1
h019-10-16
共2条回复

0 学习 · 1842 问题

查看课程