generator
-
function* 是用来创建 generator函数的语法。
-
调用generator函数时会返回一个generator对象。generator对象遵循迭代器接口,即通常所见到的next、return和throw函数。
-
generator函数用于创建懒迭代器
function* infiniteList() { let i = 0; while (i < 3) { yield i++; } } let item = infiniteList(); // @ts-ignore console.log(item.next()) // @ts-ignore console.log(item.next()) // @ts-ignore console.log(item.next()) // @ts-ignore console.log(item.next()) // { value: 0, done: false } // { value: 1, done: false } // { value: 2, done: false } // { value: undefined, done: true }
-
它允许一个函数可以暂停执行,比如当执行了第一次的item.next()后,可以先去做别的事情,然后再回来继续执行item.next()。
-
直接调用generator函数,并不会执行,只会创建一个generator对象
function* generator() { console.log('我先去喝个水,等我回来') yield 0; console.log('我回来了游戏开始') yield 1; console.log('游戏结束') } let item = generator(); // @ts-ignore console.log(item.next()) // @ts-ignore console.log(item.next()) // @ts-ignore console.log(item.next()) // @ts-ignore console.log(item.next()) /* 我先去喝个水,等我回来 { value: 0, done: false } 我回来了游戏开始 { value: 1, done: false } 游戏结束 { value: undefined, done: true } { value: undefined, done: true } */
- generator对象只会在调用next时开始执行
- 函数在执行到yield语句时会暂停并返回yield的值
- 函数在next被调用时继续恢复执行
-
generator函数的执行与否是由外部的generator对象控制的
-
-
出来yield传值到外部,也可以通过next传值到内部进行调用
function* generator() { // 接受next传入参数并赋值 let item1 = yield console.log(item1) // 返回值 yield item1 + 1 } // @ts-ignore let iterator = generator(); // @ts-ignore iterator.next() // @ts-ignore console.log(iterator.next('123')) /* 123 { value: '1231', done: false } */
-
throw函数处理迭代器内部报错
function* generator() { try{ yield 1; }catch (e) { console.log(e.message) } } let iterator = generator(); // @ts-ignore console.log(iterator.next() ) // @ts-ignore console.log(iterator.throw(new Error('error'))) /* { value: 1, done: false } error { value: undefined, done: true } */
- 外部可对generator内部进行干涉
- 外部可传递值到generator函数体中
- 外部可抛入一个异常到generator函数体中
- 外部可对generator内部进行干涉