我一直在阅读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';
});
答案 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 *() {}
和yield
或yield*
,而async / await基本上是async function () {}
和await
。虽然它们在暂停执行方面做同样的事情,直到达到像Promise那样的结果。