生成器(Generator)

生成器(Generator)简介

生成器是 JavaScript 中的一种特殊函数,允许你定义一个可以暂停和恢复执行的函数。生成器函数使用 function* 语法定义,并通过 yield 关键字暂停执行,返回一个值。生成器函数返回一个生成器对象,该对象遵循可迭代协议和迭代器协议。

基本语法

function* generatorFunction() {
    yield '第一次暂停';
    yield '第二次暂停';
    return '结束';
}

const generator = generatorFunction();

生成器对象

生成器函数返回的生成器对象具有以下方法:

  1. next(): 恢复执行,直到遇到下一个 yieldreturn。返回一个对象,包含 valuedone 属性。
    • value: yieldreturn 的值。
    • done: 布尔值,表示生成器是否执行完毕。
console.log(generator.next()); // { value: '第一次暂停', done: false }
console.log(generator.next()); // { value: '第二次暂停', done: false }
console.log(generator.next()); // { value: '结束', done: true }
  1. return(): 终止生成器执行,返回给定的值并标记生成器为完成。
console.log(generator.return('提前结束')); // { value: '提前结束', done: true }
  1. 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 }

生成器的应用场景

  1. 惰性求值: 生成器可以按需生成值,适合处理大数据集或无限序列。
function* infiniteSequence() {
    let i = 0;
    while (true) {
        yield i++;
    }
}

const sequence = infiniteSequence();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
  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));
  1. 状态管理: 生成器可以用于管理复杂的状态机。
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 中强大的工具,适用于惰性求值、异步编程和状态管理等多种场景。通过 yieldnext(),生成器提供了灵活的控制流程方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值