koa2 框架中的中间件同步还是异步的问题?

发布于 2022-09-06 21:46:23 字数 1187 浏览 14 评论 0

问题 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

二手情话 2022-09-13 21:46:23
  1. 异步函数也是函数,只是会返回一个promise对象,里面可能存在promise串联的情况
  2. promise最适合做异步操作,让异步操作看起来像是同步的,不然通过回掉会很麻烦,逻辑也不够清晰
  3. 你可以完全忽略同步函数和异步函数,都可以接收的,返回值是promise就等到promise完成
不可一世的女人 2022-09-13 21:46:23

1.因为离职1中要await next(),作为一个中间件,你很难确定你的next里面到底是同步方法还是异步方法,如果你需要等待其执行完成,那最好是当异步方法处理,当然你也可以不用async/await
2.返回Promise是目前处理异步最适合的方式,没有理解中间件的执行是一个同步的过程这句话,执行script是一个同步的过程,但里面很可能包含异步操作。
3.async function并不意味着其内部就必须含有异步方法,输出json并不需要async,更多的可能是因为方法内部可能出现异步方法并希望使用await等待其执行完成,另外async function返回的是一个Promise

孤者何惧 2022-09-13 21:46:23

首先,可以先去看一下generator,async,await 相关的基础知识和原理,看看阮一峰的教程就行。async 主要是解决了异步操作的问题,我们可以不写Promise和callback,可以像调用同步方法一样执行一个异步方法。接下来回答问题
1、当然可以不用async和await,即便是你的中间件里有异步操作,也可以通过promise来处理,只不过 async 的语法写起来更像同步的,看起来更清爽
2、因为 await 后必须是一个 promise,所以next才设计成了promise(所以还是建议你先去看看原理)。不使用promise也可以达到串联效果,那么就要利用回调了;中间件的执行你要考虑一种情况,在a中间件里,我需要调用一个接口,接口返回后再进入下一个中间件,这其实就是一个异步的情况
3、还是回到最开始,async 只是一个方案,让我们写异步方法更爽,你可以不用

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文