KoaJS Generators

  • 定义和使用

    JavaScript ES6 最令人兴奋的新特性之一是一种新的函数,称为生成器。在生成器之前,整个脚本通常是按从上到下的顺序执行的,没有一种简单的方法来停止代码的执行,以后再使用相同的堆栈继续执行。生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将跨入口保存。
  • generator 生成器

    generator(生成器)允许我们停止代码执行。因此,让我们来看一个简单的生成器。
    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() 启动生成器并运行,直到达到一个收益。然后,它返回带有 valuedone 的对象,其中 value 具有表达式值。这个表达式可以是任何东西。此时,它暂停执行。同样,当我们调用这个函数(next)时,生成器从最后一个屈服点恢复执行,函数状态在暂停时保持不变,直到下一个屈服点。这样做直到代码中不再有屈服点。
  • generator 在 Koa

    generator(生成器)在本教程中讨论的原因。您可能还记得在 hello world 程序中,我们使用函数 *() 表示法将回调传递给应用程序使用(). Koa 是一个对象,它包含一个中间件生成器函数的数组,所有这些函数在每次请求时都以类似堆栈的方式组合和执行。Koa 还实现了控制流的顺流化和逆流化。
    请看下面的示例以更好地理解这一点。
    var koa = require('koa');
    var app = koa();
      
    app.use(function* (next) {
        //在使用下一个生成函数之前做点什么
        //这将是下文的第一个事件
        console.log("1");
        yield next;
      
        //当执行返回上文时做些什么,
        //这将是上文的最后一个事件
        console.log("2");
    });
    app.use(function* (next) {
        //这将是下文的第二个事件
        console.log("3");
        yield next;
      
        //这将是第二个上文事件
        console.log("4");
    });
    app.use(function* () { 
        // 在这里,它将是下文的最后一个函数
        console.log("5");
        
        // 设置响应正文
        this.body = "Hello Generators";
    
        //上文第一个事件(从最后一个到第一个)
        console.log("6");
    });
    
    app.listen(3001);
    
    当运行上述代码并导航到 http://localhost:3001/ 我们在控制台上得到以下输出。
    1
    3
    5
    6
    4
    2
    
    当运行上述代码并导航到 http://localhost:3001/ 我们在控制台。这个基本上就是 Koa 如何使用启动的。它允许我们使用这个属性创建紧凑的中间件,并为上文和下文功能编写代码,从而避免回调。