老师我都不用async/await也是先进后出啊!

老师我都不用async/await也是先进后出啊!

const Koa = require('koa')
const app = new Koa()

const fn1 =  (ctx, next) => {
  console.log('in fn1')
  next()
  console.log('back fn1')
}

const fn2 =  (ctx, next) => {
  console.log('in fn2')
  next()
  console.log('back fn2')
}

app.use(fn1)
app.use(fn2)

app.listen(3000)

打印

in fn1

in fn2

back fn2

back fn1


正在回答

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

1回答

你的期望是什么呢?我们其他的有的资料有一些错误的解析。

看看官网的解释:

Koa is a middleware framework that can take two different kinds of functions as middleware:

async function

common function

Koa可以接收两种方式的函数传入。

第一种是我们课程中所示的:

app.use(async (ctx, next) => {  

    const start = Date.now();  

    await next();  

    const ms = Date.now() - start;  

    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);

});

这个中间件就是一个去统计所有中间件的执行时间的,可以放在最先进行引用。

第二种就是Common Function:

// Middleware normally takes two parameters (ctx, next), ctx is the context for one request,

// next is a function that is invoked to execute the downstream middleware. It returns a Promise with a then function for running code after completion.

app.use((ctx, next) => {  

const start = Date.now();  

    return next().then(() => {    

        const ms = Date.now() - start;    

        console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
     });
});

使用Then来使用next中的数据,next默认返回promise对象。


但是千万不要把async/await与common function混用,代码示例,混用就会出现下面的情况。

const Koa = require('koa')

const app = new Koa()

const fn1 = (ctx, next) => {

console.log('in fn1')

 next()

console.log('back fn1')

}

const fn2 = (ctx, next) => {

console.log('in fn2')

 next()

console.log('back fn2')

}

app.use(fn1)

app.use(async (ctx, next) => {

const start = Date.now();

console.log('start');

await next();

const ms = Date.now() - start;

console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);

});

app.use(fn2)

app.listen(3000)

打印的结果:

in fn1

start

in fn2

back fn2

back fn1

GET / - 4m


如果还按照“先进后出”的思想,应该打印:

in fn1

start

in fn2

back fn2

GET / - 3ms

back fn1

而为什么先打印了back fn1呢?

因为上面的例子中的第二个中间件是一个异步方法,nodejs在执行的时候,直接跳过,返回一个promise对象。而不是取得next之后的值,这里,await的作用就显现出来了。

而且,我在视频中说过,现在几乎所有的第三方的中间件都是使用的这种异步写法的,推荐使用async/await,避免出现上述使用common function带来的问题。

  • 喜提一名字 提问者 #1
    也是就是说使用async/await是因为使用第三方中间件时,他们大部分是这种异步写法。如果我们不用async/await写法就可能会出现阻塞(导致无法先入后出)。 这样理解对吗? 如果都是自己写的话,都没有使用异步,所有没有先入后出问题!
    2019-11-29 20:14:39
  • Brian 回复 提问者 喜提一名字 #2
    可以这么理解!!
    2019-11-29 22:56:07
  • Brian 回复 提问者 喜提一名字 #3
    自己可以写几个测试,找几个第三方库来试试~~~
    2019-11-29 23:09:07
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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