generator函数可以理解成一个异步操作的容器,它装着一些异步操作,但并不会在实例化以后立即执行。而co的思想是在恰当的时候执行这些异步操作。那么就需要一种机制,在一个异步操作执行完毕以后通知下一个异步操作开始执行。额,这句话听起来就有点耳熟了。这不就是回调函数或者promise干的事么。确实,co要求generator里yield的是thunk或者promise就是这个道理。thunk就是一种回调机制。
那么co就有两种实现方式,promise或者thunk。co4.0之前是用thunk实现的,之后是用promise实现的。
以下所有代码可以在github上查看源码。
基于thunk实现co
查看thunk函数。
大致思路就是,在yield中调用thunk,thunk回调中调用genetator的next方法,直至next返回的对象{value, done}中done为true。
function run(fn) {
//实例化generator,但因为generator的特性,并没有调用
var gen = fn();
function next(err, data) {
var result = gen.next(data);
//在调用下一次next之前,你可以加一些自己的操作
console.log('--------next in thunk----------');
if (result.done) return;
//{value:next传入的值,done:boolean},由于fn应为一个yield thunk的generator,故value接受的其实是一个回调,这个回调在co(或者说本函数run中就是generator的next)
result.value(next);
}
next();
}
调用
var readFile = thunkify