ES2015之生成器函数

132 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

生成器函数

ES2015的标准增加了:Generators即生成器函数,这篇文章我们就来了解一下什么是生成器函数。

生成器函数使用function*语法编写。 最初调用时,生成器函数不执行任何代码,而是返回一种称为Generator的迭代器。 通过调用生成器的下一个方法(即next())消耗值时,Generator函数将执行,直到遇到yield关键字。

如何使用

定义生成器函数

我们定义一个名为createUserGenerators的生成器函数,定义方式如下:

function* createUserGenerators
或
function*createUserGenerators
或
function *createUserGenerators

个人推荐使用第一种方式,感觉语义化更好点,用*标记当前函数为生成器函数,如下:

function* createUserGenerators() {
    yield { name: "也笑" }
    yield { height: "183cm" }
}

第一次调用返回:Generator的迭代器,如下:

const generator = createUserGenerators()
console.log(generator) // Object [Generator] {}

调用生成器next方法两次,如下:

console.log(generator.next());
console.log(generator.next());

输出如下:

{ value: { name: '也笑' }, done: false }
{ value: { height: '183cm' }, done: false }

再次调用next方法,执行如下:

console.log(generator.next());  //{ value: undefined, done: true }

此次调用我们可以看到valueundefineddonetrue,这是因为我们函数中只有两个yield 表达式,最后再执行表示已经执行完了。

使用场景

不知道在你刚接触前端的时候,有没有这样来请求接口:当我们需要请求两个或者更多的接口后再处理数据的时候,我们可能会一层套一层的像下请求,后面看着很不舒服,那么现在我们就可以用Generator来解决这个问题。我们来举个例子,当我们拿到所有的数据后在执行后面的操作,如下:

function* getData() {
    let name, age, height;
    yield name = '也笑'
    yield age = '812'
    yield height = '183cm'

    // do somthing
    console.log(`姓名:${name} 年龄:${age} 身高:${height}`);
}

const data = getData()

function callGenerator(task) {
    const obj = task.next()
    if (obj.done) return
    callGenerator(task)
}

callGenerator(data)

输出如下:

姓名:也笑 年龄:812 身高:183cm

注意事项

Generator函数有个next方法,我们每次调用它里面的yeild表达式的时候我们都要通过此方法。

总结

在项目中合理的使用生成器函数,可以让我们的代码看着更简洁,更容易阅读。

如果你想了解ES的其他特性,请移步到 ES2015+碎片化学习,每天都在向前走一步,这是所有文章的目录入口。