老师我都不用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
正在回答
你的期望是什么呢?我们其他的有的资料有一些错误的解析。
看看官网的解释:
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积分~
来为老师/同学的回答评分吧
0 星