在此示例中使用 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 *() {}
和 yield
或 yield*
而在 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);
});
我一直在阅读 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 *() {}
和 yield
或 yield*
而在 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);
});