koa2 框架中的中间件同步还是异步的问题?
问题 1:为什么 koa2 框架中的中间件要用 async 的形式写,很少见用同步模式(即不加 async)? 如:
app.use(async (ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
查阅了一些资料,看到阮一峰的 koa 教程中,有同步写法的例子:
const one = (ctx, next) => {
console.log('>> one');
next();
console.log('<< one');
}
const two = (ctx, next) => {
console.log('>> two');
next();
console.log('<< two');
}
const three = (ctx, next) => {
console.log('>> three');
next();
console.log('<< three');
}
app.use(one);
app.use(two);
app.use(three);
/*
output:
>> one
>> two
>> three
<< three
<< two
<< one
*/
这里完全没有 async 的出现,阮神只是在后面提到: “迄今为止,所有例子的中间件都是同步的,不包含异步操作。如果有异步操作(比如读取数据库),中间件就必须写成 async 函数。”
接着找资料发现 koa2 中间件的 next 返回的是 promise,因为源码中的 dispatch(i)返回的就是 promise, 这样我又有一个疑问,
问题 2:为什么要设计成返回 promise ?不返回 promise 就达不到中间件串联的效果吗? 因为中间件的执行在理解上是一个同步的过程,所以设计成异步要怎么去理解??
问题 3:是不是用 koa2 写的代码都存在很多 async 的 function(公司项目代码到处都是 async 的,返回输出 json 的时候也需要 async 吗?)? 有没有不需要写 async 的场景或者例子?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1.因为离职1中要
await next()
,作为一个中间件,你很难确定你的next
里面到底是同步方法还是异步方法,如果你需要等待其执行完成,那最好是当异步方法处理,当然你也可以不用async/await
。2.返回
Promise
是目前处理异步最适合的方式,没有理解中间件的执行是一个同步的过程
这句话,执行script
是一个同步的过程,但里面很可能包含异步操作。3.
async function
并不意味着其内部就必须含有异步方法,输出json
并不需要async
,更多的可能是因为方法内部可能出现异步方法并希望使用await
等待其执行完成,另外async function
返回的是一个Promise
。首先,可以先去看一下generator,async,await 相关的基础知识和原理,看看阮一峰的教程就行。async 主要是解决了异步操作的问题,我们可以不写Promise和callback,可以像调用同步方法一样执行一个异步方法。接下来回答问题
1、当然可以不用async和await,即便是你的中间件里有异步操作,也可以通过promise来处理,只不过 async 的语法写起来更像同步的,看起来更清爽
2、因为 await 后必须是一个 promise,所以next才设计成了promise(所以还是建议你先去看看原理)。不使用promise也可以达到串联效果,那么就要利用回调了;中间件的执行你要考虑一种情况,在a中间件里,我需要调用一个接口,接口返回后再进入下一个中间件,这其实就是一个异步的情况
3、还是回到最开始,async 只是一个方案,让我们写异步方法更爽,你可以不用