Generator 函数是 ES6 提供的一种异步编程解决方案。Generator函数 可以在的执行过程中暂停,然后也可以从暂停的地方继续执行。Generator 函数不能作为构造函数。
Generator 函数特征 ① function 关键字与函数名之间有一个 *
;② 函数体内部使用 yield
表达式。
示例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function * foo ( ) { for (let i = 0 ; i < 3 ; i++) { yield i } } console .log (foo ()) let f = foo ()console .log (f.next ()) console .log (f.next ()) console .log (f.next ()) console .log (f.next ())
注意:yield
表达式只能用在 Generator 函数里面,用在其他地方都会报错。
1 2 3 4 5 6 function * gen (a ) { a.forEach (function (item ) { yield item; } }); };
上面代码也会产生句法错误,因为 forEach
方法的参数是一个普通函数,但是在里面使用了 yield
表达式。
Generator 函数可以不用 yield
表达式,这时就变成了一个单纯的暂缓执行函数。
1 2 3 4 5 6 7 8 9 function * f ( ) { console .log ('执行了!' ) } let generator = f ();setTimeout (function ( ) { generator.next () }, 2000 );
yield
表达式本身没有返回值,或者说总是返回 undefined
。next
方法可以带一个参数,该参数就会被当作上一个 yield
表达式的返回值。
1 2 3 4 5 6 7 8 9 function * gen (x ) { let y = 2 * (yield (x + 1 )) let z = yield (y / 3 ) return x + y + z } let g = gen (5 )console .log (g.next ().value ) console .log (g.next (12 ).value ) console .log (g.next (13 ).value )
Generator 函数的异步应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function ajax (url, callback ) { } function request (url ) { ajax (url, res => { getData.next (res) }) } function * gen ( ) { let res1 = yield request ('a.json' ) console .log (res1) let res2 = yield request ('b.json' ) console .log (res2) let res3 = yield request ('c.json' ) console .log (res3) } let getData = gen ()getData.next ()