Nodejs中function* 是个什么啊?
Nodejs中function* 是个什么啊?
这两天在研究koa框架(可以参见http://koa.rednode.cn/ ), 但是里面的函数名好多都是*,运行的时候根本跑步起来。。
文档有有这样一段: 与普通的 function 不同,generator functions 以 function* 声明。以这种关键词声明的函数支持 yield
是我的方法不对嘛?
下面是文档中的代码。。。
var koa = require(‘koa’); var app = koa();
// x-response-time
app.use(function *(next){ var start = new Date; yield next; var ms = new Date - start; this.set(‘X-Response-Time’, ms + ‘ms’); });
// logger
app.use(function *(next){ var start = new Date; yield next; var ms = new Date - start; console.log(’%s %s - %s’, this.method, this.url, ms); });
// response
app.use(function *(){ this.body = ‘Hello World’; });
app.listen(3000);
当然可以!function*
在 Node.js 中被称为生成器函数(Generator Functions),它们是一种特殊类型的函数,可以暂停执行并在稍后恢复。生成器函数通过 function*
关键字来定义,并且可以在函数体内使用 yield
关键字来暂停执行。
生成器函数的基本概念
- 定义:生成器函数使用
function*
来定义。 - 暂停执行:生成器函数可以通过
yield
关键字来暂停执行。 - 恢复执行:生成器函数可以通过迭代器对象的
next()
方法来恢复执行。
示例代码
让我们来看一个简单的生成器函数示例:
// 定义一个生成器函数
function* simpleGenerator() {
console.log('开始执行');
yield '第一步';
console.log('第二步');
yield '第二步完成';
console.log('第三步');
}
// 创建一个迭代器对象
const iterator = simpleGenerator();
// 调用 next() 方法来启动生成器
console.log(iterator.next()); // 输出: { value: '第一步', done: false }
console.log(iterator.next()); // 输出: { value: undefined, done: false } 因为没有更多 yield 语句了
console.log(iterator.next()); // 输出: { value: undefined, done: true }
Koa 框架中的生成器函数
Koa 框架广泛使用生成器函数来处理中间件。中间件函数可以使用 yield
来等待异步操作完成,例如数据库查询或文件读取。
以下是 Koa 框架中使用生成器函数的一个简单示例:
const Koa = require('koa');
const app = new Koa();
// 中间件1
app.use(async function(ctx, next) {
console.log('中间件1开始');
await next();
console.log('中间件1结束');
});
// 中间件2
app.use(async function(ctx, next) {
console.log('中间件2开始');
await next();
console.log('中间件2结束');
});
// 响应中间件
app.use(async function(ctx) {
ctx.body = 'Hello World';
});
// 启动服务器
app.listen(3000);
console.log('服务器已启动,监听端口3000');
在这个例子中,await next()
用于等待下一个中间件完成,然后再继续执行当前中间件。
总结
function*
在 Node.js 中定义生成器函数,这些函数可以通过 yield
关键字暂停执行。在 Koa 框架中,生成器函数常用于中间件处理,允许你编写更简洁、更易于管理的异步代码。希望这能帮助你更好地理解 function*
的用途和用法!
function *() {} 是 es6 中的 generatorFunction,node 应该是从 0.11.3开始支持。 因此在低于这个版本的 node 中是不能运行的。
至于 generatorFunction, generator, yield,可以看看 generator详解 by @尤小右
generator是最新的ES6特性, 可以实现暂停generator内部代码执行, 但不影响 外部代码. 具体可以参看这里 http://n.thepana.com/2014/01/02/generator/
除了generator, ES6还有许多新特性, 非常cool 可以研究下.
TJ大神使用这个特性开发了 co 库, 可以实现 线性代码, 异步操作, 非常厉害, koa是在co基础之上开发的新的 web框架, 其定位同connect是类似的.
顺便说下 koa 文档的地址写错了, 多了一个逗号.
function*
在 Node.js 中定义的是一个生成器函数(Generator Function)。生成器函数是一种特殊的函数,它可以通过 yield
关键字暂停并恢复执行,从而可以分阶段处理复杂的异步逻辑。
生成器函数返回一个生成器对象(Generator Object),该对象实现了迭代器协议,并且具有 next()
方法,可以通过调用 next()
方法来逐次执行生成器函数的代码块。每次调用 next()
方法时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个 yield
表达式或函数结束。
下面是一个简单的生成器函数的例子:
function* simpleGenerator() {
console.log('First yield');
yield;
console.log('Second yield');
yield;
console.log('Function finished');
}
const gen = simpleGenerator();
gen.next(); // 输出 "First yield"
gen.next(); // 输出 "Second yield"
gen.next(); // 输出 "Function finished"
在你的 Koa 框架代码中,每个中间件函数都是一个生成器函数。Koa 使用生成器函数来简化异步操作,如等待其他中间件完成或处理 I/O 操作等。yield
关键字通常用于等待异步操作完成。
例如,在你的代码中:
// x-response-time
app.use(function *(next) {
var start = new Date;
yield next; // 等待下一个中间件完成
var ms = new Date - start;
this.set('X-Response-Time', ms + 'ms');
});
这里的 yield next
语句使得当前中间件暂停执行,直到下一个中间件执行完毕。这种方式使得 Koa 能够高效地管理多个中间件之间的顺序执行和异步操作。