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

时间:2017-03-21 05:34:30

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

我一直在阅读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());
});

在这里使用生成器的目的是什么?我必须承认我理解他们是如何工作的,但绝对不会在这里看到效用。它们是异步/等待工作所必需的吗?

为什么不是上面的例子:

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

即使他们的Hello World应用程序也没有这样做:

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

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

Koa遵循堆叠中间件的意识形态,因此它们提供了遵循并强调这种意识形态的例子。

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

所以在你提供的例子中,我将其视为

从第一个中间件(minifyHTML)开始,它首先要做的是等待下一个中间件完成然后再进行缩小。

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