一、特征:
1. 形式上,是一个普通函数。
2. 是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。
3. 从语法上,首先可以把它理解成一个状态机,封装了多个内部状态,还是一个遍历器对象生成函数。
4. function 命令与函数名之间有一个星号。
5. 函数体内部使用yield语句定义不同的内部状态。
二、示例:
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
// 调用函数不会执行,返回遍历器对象。
var hw = helloWorldGenerator();
hw.next(); // {value: 'hello', done: false} value表示当前内部状态的值,done表示是否遍历结束
hw.next(); // {value: 'world', done: false}
hw.next(); // {value: undefined, done: true}
Generator函数是分段执行的,yeild语句是暂停执行的标记,而next方法可以恢复执行。
调用Generator函数返回一个遍历器对象,代表Generator函数的内部指针。
三、应用:
1. Generator函数的一个重要实际意义就是用于处理异步操作,改写回调函数。
AJAX是典型的异步操作,通过Generator函数部署AJAX操作,可以用同步的方式表达。
function* main() {
var result = yield request('hettp://some.url');
var resp = JSON.parse(result);
console.log(resp.value);
}
function request(url) {
makeAjaxCall(url, function(response) {
it.next(response);
});
}
var it = main();
it.next();