生成器(Generator)简介
生成器是 JavaScript 中的一种特殊函数,允许你定义一个可以暂停和恢复执行的函数。生成器函数使用 function*
语法定义,并通过 yield
关键字暂停执行,返回一个值。生成器函数返回一个生成器对象,该对象遵循可迭代协议和迭代器协议。
基本语法
function* generatorFunction() {
yield '第一次暂停';
yield '第二次暂停';
return '结束';
}
const generator = generatorFunction();
生成器对象
生成器函数返回的生成器对象具有以下方法:
next()
: 恢复执行,直到遇到下一个yield
或return
。返回一个对象,包含value
和done
属性。value
:yield
或return
的值。done
: 布尔值,表示生成器是否执行完毕。
console.log(generator.next()); // { value: '第一次暂停', done: false }
console.log(generator.next()); // { value: '第二次暂停', done: false }
console.log(generator.next()); // { value: '结束', done: true }
return()
: 终止生成器执行,返回给定的值并标记生成器为完成。
console.log(generator.return('提前结束')); // { value: '提前结束', done: true }
throw()
: 在生成器内部抛出错误,可以在生成器内部捕获。
function* errorGenerator() {
try {
yield '正常执行';
} catch (e) {
yield '捕获错误: ' + e;
}
}
const errorGen = errorGenerator();
console.log(errorGen.next()); // { value: '正常执行', done: false }
console.log(errorGen.throw('出错了')); // { value: '捕获错误: 出错了', done: false }
生成器的应用场景
- 惰性求值: 生成器可以按需生成值,适合处理大数据集或无限序列。
function* infiniteSequence() {
let i = 0;
while (true) {
yield i++;
}
}
const sequence = infiniteSequence();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
- 异步编程: 生成器与
Promise
结合,可以简化异步代码。
function* asyncGenerator() {
const result = yield new Promise(resolve => setTimeout(() => resolve('完成'), 1000));
console.log(result);
}
const asyncGen = asyncGenerator();
const promise = asyncGen.next().value;
promise.then(result => asyncGen.next(result));
- 状态管理: 生成器可以用于管理复杂的状态机。
function* stateMachine() {
let state = '开始';
while (true) {
const action = yield state;
if (action === '下一步') state = '进行中';
else if (action === '结束') state = '结束';
}
}
const machine = stateMachine();
console.log(machine.next().value); // '开始'
console.log(machine.next('下一步').value); // '进行中'
console.log(machine.next('结束').value); // '结束'
总结
生成器是 JavaScript 中强大的工具,适用于惰性求值、异步编程和状态管理等多种场景。通过 yield
和 next()
,生成器提供了灵活的控制流程方式。