Javascript Generator Functions

Posted xiaoke2012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript Generator Functions相关的知识,希望对你有一定的参考价值。

Example

/*
/*
function需要用*标记
yiled 可以返回多个值
*/
function* calculate(a,b){
    yield a + b;
    yield a + a;
    throw ‘some error‘//遇到错误立即返回,所以以下代码不会被执行
    yield a * a;
    return b + b;
}

let gen = calculate(1,3);//直接调用generator function并非返回值,而是返回一个generator的函数对象
console.log(gen);

//需要单独一次调用next()函数,依次返回yield的值
//return返回的对象done是true。如果直接到没有return到函数结尾,返回的对象done是true,value是undefined
//如果函数已经结束(done是true)。再调用next(),会一直是{value: undefined, done: true}
gen.next(); //{value: 4, done: false}
gen.next();//{value: 2, done: false}
gen.next(); //Uncaught some error
gen.next();//{value: undefined, done: true}
gen.next();

Example - Generator functions和Promise

var promiseGenerator = function*(){
yield new Promise(r=>setTimeout(r,2000))
yield 5;
}

let gen = promiseGenerator()
gen.next().value.then(v=>console.log("hi. I am back."))//返回Promise对象。调用then 打印log信息
gen.next().value//打印第二个yield的结果 5
/*
从结果上看会先打印5,然后显示log信息。因为Promise的方法是异步的会等待2秒。
所以yield并不保证Promise的方法执行完才调下一个yield的结果。
如果想要5在Promise方法结束后显示可以在Promise中的then中调用generator的next()方法一下的code
gen.next().value.then(v=>{
console.log("has passed 5 seconds. will write the value: ",gen.next().value)
})
*/

  


以上是关于Javascript Generator Functions的主要内容,如果未能解决你的问题,请参考以下文章

使用Generator函数进行异步编程

JavaScript中的Generator函数

javascript Javascript Slug Generator

ES6知识点-Generator

javascript JavaScript UUID Generator - 非常非常独特

JavaScript异步编程:Generator与Async