接着上一部分继续了解JS 基础之异步(四):Generator(生成器、迭代器源码实现)
Generator函数
function *
会定义一个生成器函数,并返回一个Generator(生成器)对象,其内部可以通过 yield 暂停代码,通过调用 next 恢复执行。
调用一个生成器对象并不会马上执行里面的代码语句,而是返回一个这个生成器的迭代器(iterator)对象。当这个迭代器对象的next()
方法被调用时,其内部的语句就会被执行到yield
的位置,yield
后紧跟需要返回的值(可以是函数或表达式)。如果遇到的yield
为yield*
的话,则表示将执行权交给另一个生成器函数(当前生成器暂停执行)。
注意:
- generator function内部才能使用
yield/yield*
命令,而generator function内部调用的或声明的其他普通函数是不能调用yield/yield*
命令的。 - 箭头函数不能使用
yield
,即箭头函数不能用做generator function(但可以用做async function)
// 声明式
function* generator() {
}
// 表达式
let generator = function* (){
}
// 作为对象属性
let obj = {
generator: function* (){
}
}
// 箭头函数不能用做generator function,报错
let obj = {
generator: *() => {
}
}
// 箭头函数可以用做 async 函数
let obj = {
generator: async () => {
}
}
在生成器中return
遍历返回对象的done值为true时迭代即结束,不对该value处理。
function* createIterator() {
yield 'a'
return 1
yield 'b'
}
let iterator = createIterator()
iterator.next()