ES2018之异步生成器函数

615 阅读2分钟

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

异步生成器函数

ES2018的标准增加了: async-generator-functions即异步生成器函数,之前的一些文章有提到过相应的内容,此篇文章我们一起再梳理一下。

如何使用

这篇文章ES2015之生成器函数已经讲解了什么是生成器函数,那么什么又是异步生成器函数呢,我们来看一下这个例子:

function resloveName() {
    return new Promise((reslove, reject) => {
        setTimeout(() => {
            reslove('也笑')
        }, 2000)
    })
}

async function* outputName() {
    console.log('开始', Date.now());
    const name = await resloveName();
    console.log('结束:', name, Date.now());
    yield 'slifree';
    console.log('yield 结束');
}

看到*标志,我们就知道它是一个生成器函数,而async关键字是异步函数的标志,所以合在一起就是异步生成器函数。此时我们直接运行outputName()是没有结果的,我们需要通过next方法调用,如下:

const asyncGenerator=outputName();
asyncGenerator.next()

输出结果为:

开始 1637464817195
结束: 也笑 1637464819215

如果我们再执行一次asyncGenerator.next()的输出结果是:

yield 结束

注意事项

我们需要注意的是:生成器函数不止有next方法,我们还可以使用close方法来停止当前的函数执行:此时,如果我们继续执行next方法,则会出错,如下:

throws StopIteration (as the generator is now closed)

总结

同生成器函数一样,异步生成器函数在项目中也是很少用到的,一般根据项目需求用来处理或者封装一些特定的功能。比如我们可以写一个根据翻页笔进行远程操控的一个翻页功能

我们封装好一个翻页功能方法,当向下翻页的时候步骤加一,当向上翻页的时候步骤减一,每次翻页都执行一次next方法。

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