作用:提供异步编程方案
语法
function * gen ( ) {
yield 'hello' ;
yield 'world' ;
return 'baibai'
}
const g = gen ( ) ;
g. next ( )
g. next ( )
g. next ( )
yield表达式
next的运行逻辑
遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。 下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式。 如果没有再遇到新的yield表达式,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。 如果该函数没有return语句,则返回的对象的value属性值为undefined。
function * gen ( ) {
const res1 = yield 1 ;
console. log ( res1)
const res2 = yield 2
console. log ( res2)
return 3
}
const g = gen ( )
g. next ( '返回值1' )
g. next ( '返回值2' )
g. next ( '返回值3' )
Generator与Promise一起使用
const p1 = new Promise ( ( resolve, reject ) => {
resolve ( 'p1成功了' )
} )
const p2 = new Promise ( ( resolve, reject ) => {
resolve ( 'p2成功了' )
} )
const p3 = new Promise ( ( resolve, reject ) => {
resolve ( 'p3成功了' )
} )
function * getResult ( ) {
yield p1
yield p2
yield p3
return 1
}
const g = getResult ( )
g. next ( ) . value. then ( data1 => {
if ( data1) g. next ( ) . value. then ( data2 => {
if ( data2) g. next ( ) . value. then ( data3 => {
console. log ( data1, data2, , data3)
} )
} )
} )
自动运行生成器
function run ( gen ) {
const g = gen ( ) ;
function next ( data ) {
const result = g. next ( data) ;
if ( result. done) return result. value;
result. value. then ( function ( data ) {
console. log ( data) ;
next ( data) ;
} ) ;
}
next ( ) ;
}
run ( getResult)
async/await语法糖
async function getResult ( ) {
const res = await p1
}