Koa.js - 生成器
JavaScript ES6 最令人兴奋的新功能之一是新函数,称为生成器。在生成器出现之前,整个脚本通常按从上到下的顺序执行,没有简单的方法停止代码执行并在稍后使用相同的堆栈恢复。生成器是可以退出并稍后重新进入的函数。它们的上下文(变量绑定)将在重新进入时保存。
生成器允许我们在中间停止代码执行。因此,让我们看一个简单的生成器。
var generator_func = function* (){ yield 1; yield 2; }; var itr = generator_func(); console.log(itr.next()); console.log(itr.next()); console.log(itr.next());
运行上述代码时,结果如下。
{ value: 1, done: false } { value: 2, done: false } { value: undefined, done: true }
让我们看看上面的代码。我们首先创建一个名为 generator_func() 的生成器。我们创建了这个看起来很奇怪的函数的一个实例,并将其分配给 itr。然后我们开始在这个 itr 变量上调用 next()。
调用 next() 会启动生成器,它会一直运行,直到达到收益。然后它返回带有值和 done 的对象,其中值具有表达式值。这个表达式可以是任何东西。此时,它会暂停执行。再次,当我们调用此函数(next)时,生成器将从最后一个收益点恢复执行,函数状态与暂停时相同,直到下一个收益点。一直到代码中没有更多收益点为止,都会这样做。
Koa 中的生成器
那么我们为什么要在本教程中讨论生成器呢?您可能还记得 hello world 程序,我们使用 function* () 符号将回调传递给 app.use()。Koa 是一个对象,它包含一个中间件生成器函数数组,所有这些函数都是在每次请求时以类似堆栈的方式组合和执行的。Koa 还实现了控制流的下游和上游。
请看下面的例子,以更好地理解这一点。
var koa = require('koa'); var app = koa(); app.use(function* (next) { //在屈服于下一个生成器函数之前执行某些操作 //在将成为下游中的第一个事件的行中 console.log("1"); 屈服下一个; //在执行返回上游时执行某些操作, //这将是上游中的最后一个事件 console.log("2"); }); app.use(function* (next) { // 这将是下游的第二个事件 console.log("3"); 屈服下一个; // 这将是上游的第二个事件 console.log("4"); }); app.use(function* () { // 这里将是下游的最后一个函数 console.log("5"); // 设置响应主体 this.body = "Hello Generators"; // 上游的第一个事件(从最后一个到第一个) console.log("6"); }); app.listen(3000);
运行上述代码并导航到 https://localhost:3000/ 时,我们会在控制台上获得以下输出。
1 3 5 6 4 2
这本质上就是 Koa 使用生成器的方式。它允许我们使用这个属性创建紧凑的中间件,并为上游和下游功能编写代码,从而节省我们的回调。