这是我参与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+碎片化学习,每天都在向前走一步,这是所有文章的目录入口。