📅  最后修改于: 2020-10-23 07:43:07             🧑  作者: Mango
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()会启动生成器,并且它将一直运行直到达到产量为止。然后,它返回带有value的对象并完成,其中value具有表达式值。这个表达式可以是任何东西。此时,它将暂停执行。同样,当我们调用此函数(下一个)时,生成器从上一个屈服点恢复执行,暂停时函数状态相同,直到下一个屈服点。这样做直到代码中没有更多的屈服点。
那么,为什么在本教程中讨论生成器。您可能从hello world程序中还记得,我们使用函数*()表示法将回调传递给app.use()。 Koa是一个对象,包含一组中间件生成器函数,所有这些函数均根据每个请求以堆栈状的方式组合和执行。 Koa还执行下游控制流。
请看以下示例,以更好地理解这一点。
var koa = require('koa');
var app = koa();
app.use(function* (next) {
//do something before yielding to next generator function
//in line which will be 1st event in downstream
console.log("1");
yield next;
//do something when the execution returns upstream,
//this will be last event in upstream
console.log("2");
});
app.use(function* (next) {
// This shall be 2nd event downstream
console.log("3");
yield next;
// This would be 2nd event upstream
console.log("4");
});
app.use(function* () {
// Here it would be last function downstream
console.log("5");
// Set response body
this.body = "Hello Generators";
// First event of upstream (from the last to first)
console.log("6");
});
app.listen(3000);
运行上面的代码并导航到https:// localhost:3000 /时,我们在控制台上获得以下输出。
1
3
5
6
4
2
本质上,这就是Koa使用生成器的方式。它允许我们使用此属性创建紧凑的中间件,并为上游和下游功能编写代码,从而使我们免于回调。