Generator[生成器]
定义
- 是一个特殊的迭代器,是一种函数控制、使用的方案,它可以让我们更加灵活的 控制函数什么时候执行、暂停执行
- 生成器函数
(1) 定义: function 之后 添加 * 号就是生成器函数,可以搭配 yield 控制代码的执行流程,返回一个生成器(对象)
(2) 关键字: yield [控制代码的执行流程] 每一个yield就是一个暂停,yield可以用来返回值
(3) 与return 区别 : return 不执行后面的代码,结束执行,yield只是暂停
let foo=function*() {
console.log(1)
yield 2
console.log(3)
}
let genObj=foo()
let value=genObj.next() -->1
console.log(value) --> { done:false, vlaue: 2 }
genObj.next() -->3
注意: 如果需要在某个yield代码块中获取next函数传递的参数,需要用上一个yield去接收
let foo=function*() {
let value=yield 2
console.log(value**3)
yield 2
}
let genObj=foo()
genObj.next()
genObj.next(2)
return方法
- 定义: 终止生成器函数,返回传递的参数,并阻止接下来的next( )方法
let add=function*() { console.log(11) let value=yield 222 // 接收第二个next函数传递的参数 yield 222*value console.log(3333) } let genAdd=add() let value = genAdd().return(2) --> { done:true, value: 2 } // 不执行 genAdd.next()
throw方法
- 定义: 终止生成器函数,抛出异常,如果不捕获异常会阻止接下来的next( )方法,捕获则会继续执行接下来的生成器对象方法
let add=function*() { console.log(11) yield try { console.log(22) yield } catch(err) { console.log(err) } yield console.log(33) } let genAdd=add() genAdd.next() genAdd.next() genAdd.throw('error') genAdd.next()
yield*
- 定义: 迭代可迭代对象
function* genArr(arr){ yeild* arr /* 等价于 */ for( item of arr ){ yield item } } let arr = genArr( [1,2,3] )
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!