学习下js下的生成器,Gen-run是一个可持续生成器,附带例子可以看下它的威力
function run(generator, callback){
variterator= generator(resume);//iterator就是一个生成器对象
//console.log(iterator.toString());//generator
vardata=null,yielded=false;
varnext= callback ?nextSafe:nextPlain;//callback为null,所以就是nextPlain
//console.log(next.toString());//nextPlain
console.log('next');
next();//nextPlain(),没有参数
console.log('check after next');
check();
function nextSafe(item){
varn;
try{
n=iterator.next(item);
if(!n.done){
if(typeofn.value==="function") n.value(resume());
yielded=true;
return;
}
}
catch(err){
return callback(err);
}
return callback(null,n.value);
}
function nextPlain(item){
console.log('nextPlain');
//console.log(item);//undefined
console.log('iterator.next');
varcont=iterator.next(item).value;//返回函数,该例中是sleep(1000)之后的返回的函数
//console.log(cont.toString());
if(typeofcont==="function") {
cont(resume());
}//sleep(1000)执行之后的匿名函数,调用resume()的返回值,也是匿名函数
yielded=true;
}
function resume(){
console.log('resume');
vardone=false;
return function(){
if(done){
console.log('resume done');
return;
}
console.log('resume not done');
done=true;
data=arguments;
//console.log(arguments);//arguments为空对象
console.log('resume check');
check();
};
}
function check(){
//console.log(data && yielded);
while(data&&yielded){
varerr=data[0];
varitem=data[1];
data=null;
yielded=false;
if(err) return iterator.throw(err);
console.log('check next');
next(item);
yielded=true;
}
}
}
function sleep(ms){
console.log('sleep');
return function(callback){
setTimeout(callback, ms);
};
}
//next-->nextPlain-->生成器执行直到next-->sleep(1000)-->resume-->sleep匿名-->resume匿名-->check(直接返回)-->异步等待1s
// -->resume中的check-->next(check内的next)-->下一轮循环
run(function*(){
console.log('started');
//yield 1;
yieldsleep(1000);
console.log('almost finish');
//yield 2;
yieldsleep(1000);dd
console.log('done');
});