- Koa.js 教程
- Koa.js - 主页
- Koa.js - 概述
- Koa.js - 环境
- Koa.js - 你好世界
- Koa.js - 生成器
- Koa.js - 路由
- Koa.js - URL 构建
- Koa.js - HTTP 方法
- Koa.js - 请求对象
- Koa.js - 响应对象
- Koa.js - 重定向
- Koa.js - 错误处理
- Koa.js - 级联
- Koa.js - 模板
- Koa.js - 表单数据
- Koa.js - 文件上传
- Koa.js - 静态文件
- Koa.js - Cookie
- Koa.js - 会话
- Koa.js - 身份验证
- Koa.js - 压缩
- Koa.js - 缓存
- Koa.js - 数据库
- Koa.js - RESTful API
- Koa.js - 日志记录
- Koa.js - 脚手架
- Koa.js - 资源
- Koa.js 有用资源
- Koa.js - 快速指南
- Koa.js - 有用的资源
- Koa.js - 讨论
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() 启动生成器并运行直到达到产量。然后它返回带有 value 的对象并完成,其中 value 具有表达式值。这个表达式可以是任何东西。此时,它暂停执行。同样,当我们调用这个函数(next)时,生成器从上一个让出点恢复执行,函数状态与暂停时相同,直到下一个让出点。这样做直到代码中不再有屈服点为止。
科阿的发电机
那么我们为什么要在本教程中讨论生成器呢?您可能还记得 hello world 程序中的内容,我们使用function* ()表示法将回调传递给 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 使用生成器的方式。它允许我们使用此属性创建紧凑的中间件,并为上游和下游功能编写代码,从而使我们免于回调。