在此示例中使用 JavaScript 生成器的目的是什么?

What is the purpose of using a JavaScript generator in this example?

我一直在阅读 Koa.js documentation,这似乎是一个非常酷的小平台,我想了解更多关于 async/await 和其他好东西的知识。

看来我不太了解生成器在新 JS 中的作用。我将 运行 保留为如下示例:

// Using .is()
const minify = require('html-minifier');

app.use(function * minifyHTML(next) {
  yield next;

  if (!ctx.response.is('html')) return;

  let body = ctx.body;
  if (!body || body.pipe) return;

  if (Buffer.isBuffer(body)) body = body.toString();
  ctx.body = minify(body);
});


// Streams
app.use(function * (next) {
  ctx.body = someHTTPStream.on('error', ctx.onerror).pipe(PassThrough());
});

这里使用生成器的目的是什么?我不得不承认我了解它们的工作原理,但绝对看不到这里的实用性。它们是 async/await 工作所必需的吗?

为什么不是上面的例子:

app.use(function(next) {
  ctx.body = 'Hello World';
});

甚至他们的 Hello World 应用程序也不这样做:

app.use(ctx => {
  ctx.body = 'Hello World';
});

Koa遵循堆叠中间件的思想,因此他们提供了遵循并强调这种思想的例子。

afaik,中间件被描述为一个堆栈,在代码执行方面使用了fifo。

所以在你提供的例子中,我正在阅读它

从第一个中间件 (minifyHTML) 开始,它做的第一件事是等待下一个 middleware/s 完成,然后继续缩小。

但 async/await 上的情况并非如此。用于生成器的关键字是 function *() {}yieldyield* 而在 async/await 上基本上是 async function () {}await。尽管他们在暂停执行方面做同样的事情,直到像 Promise 那样获得结果。

Koa 使用生成器来执行序列中的下一个中间件。

Koa 生成器是 Koa 在 2.0.0 版本之前处理中间件功能的方法。 Koa 2.x 使用 async/await 代替,这是 JavaScript.

的新功能

您示例中显示的中间件在 Koa v2 中看起来像这样:

app.use((ctx, next) => {
    await next(); // Execute the next middleware in the sequence

    if (!ctx.response.is('html')) return;

    let body = ctx.body;
    if (!body || body.pipe) return;

    if (Buffer.isBuffer(body)) body = body.toString();
    ctx.body = minify(body);
});