Generator 對(duì)象
普通函數(shù)定義時(shí)在 function
關(guān)鍵字后面添加 *
即可聲明一個(gè)生成器,函數(shù)返回一個(gè)可迭代對(duì)象端衰,函數(shù)內(nèi)部通過 yield
關(guān)鍵字來指定調(diào)用迭代器的 next()
方法時(shí)的返回值及返回順序
function* test() {
yield 'a'
yield 'b'
yield 'c'
}
const g = test()
g // test {<suspended>}
g.next() // {value: 'a', done: false}
g.next() // {value: 'b', done: false}
g.next() // {value: 'c', done: false}
g.next() // {value: undefined, done: true}
生成器函數(shù)返回的生成器對(duì)象含有 Symbol.Interator
屬性甘改,可以使用 for of
進(jìn)行遍歷
for(value of g) {
console.log(value)
}
// a
// b
// c
注意:使用 for of
遍歷之前如果使用了 next()
調(diào)用,則只會(huì)遍歷到未被調(diào)用的 yield
后的值
g.next() // {value: 'a', done: false}
for(value of g) {
console.log(value)
}
// b
// c
next 傳參
使用 next()
時(shí)可以通過傳入?yún)?shù)來改變 yield
的返回值抵代,如下
function* gen(a) {
const b = 2 * (yield(a - 1))
const c = yield(b / 4)
return (a + b + c)
}
// a = 2
const g = gen(2)
console.log(g.next()) // {value:1, done:false}
// next(6)傳入的值為 yield 表達(dá)式的值,此時(shí) b = 12
console.log(g.next(6)) // {value:3, done:false}
// next(3)傳入的值為 yield 表達(dá)式的值,此時(shí) c = 3
console.log(g.next(3)) // {value:17, done:true}
Generator函數(shù)嵌套
要求使用生成器函數(shù)改造以下代碼忘嫉,實(shí)現(xiàn)每隔一秒按順序輸出 1庆冕,2,3访递,4,5
for(let i = 0; i <= 5; i++) {
setTimeout(() => {
console.log(i)
},1000)
}
改寫如下
const delay = n => new Promise(resolve => {
setTimeout(() => {
resolve(n)
},1000)
})
function* g() {
for(let i = 1; i <= 5; i++) {
const x = yield delay(i)
console.log(x)
}
}
function co(g) {
const o = g()
next()
function next(a) {
const {value, done} = o.next(a)
if(done) return
value.then(data => next(data))
}
}
co(g)