【问题标题】:What is the purpose of using a JavaScript generator in this example?在这个例子中使用 JavaScript 生成器的目的是什么?
【发布时间】:2017-08-12 15:32:51
【问题描述】:

我一直在阅读Koa.js documentation,这似乎是一个非常酷的小平台,我想了解更多关于异步/等待和其他好东西的信息。

看起来我不太了解生成器在新 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 没有使用async/await,它仍然被生成器卡住(但出于相同目的使用它们)
  • Koa 手动运行生成器,使 yield 的使用类似于 await 原生的行为

标签: javascript express ecmascript-6 async-await koa


【解决方案1】:

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);
});

【讨论】:

  • 所以,next->next->next 直到它用完中间件然后是 if if (!ctx.response)?
  • next() 将转到通过 app.use 包含的顺序指定的下一个中间件。一旦下一个中间件完成执行,调用 next() 的中间件将恢复执行。您可以将其想象为中间件调用的递归堆栈,在每一层中,您都可以在每个中间件调用之前执行预处理,以及在生成的中间件调用链完成执行之后执行后处理。
【解决方案2】:

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

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

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

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

但在 async/await 上不会出现这种情况。用于生成器的关键字是 function *() {}yieldyield* 而在 async/await 上基本上是 async function () {}await。虽然他们在暂停执行方面做同样的事情,直到像 Promise 一样获得结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多