Gen-run.js的学习

学习下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');

});

你可能感兴趣的:(Gen-run.js的学习)