您的位置:首页 > Web前端 > Node.js

Co-使用co自动化执行Generator函数

2016-07-09 23:06 573 查看

co是如何工作的

co是用来自动执行generator函数的工具。那么,首先你需要知道generator。Generator的好处是可以在定义函数时候就打上“断点”,调用函数时候可以在断点的地方暂停函数的执行。Generator带来的问题是如何控制什么时候进行下一步调用。co就是解决这个问题的。

下面所有代码可以到github上查看源代码。

fs = require('fs');
co = require('co');

//thunkify是一个nodejs库,下面我会展示其简单的实现原理,如果这步你看不懂,可以暂时认为readFile为一个普通函数
var readFile = thunkify(fs.readFile);

var gen = function* (){
var r1 = yield readFile('./hi.txt');
console.log(r1.toString());
var r2 = yield readFile('./hello.txt');
console.log(r2.toString());
};
var gen2 = function* (){
var r1 = yield 1;
console.log(r1.toString());
var r2 = yield 2;
console.log(r2.toString());
};

console.log('------------------run co--------------------');
console.log('-----------gen------------');
co(gen);
console.log('-----------gen2-----------');
co(gen2);


执行结果:



由这个执行结果我们至少可以看出两点:1)普通的generator是不能放到co里进行自动执行的(gen2没有自动执行) 2)co可以实现异步执行(三个console前后打出,才返回gen执行的结果)

那么,什么样的generator才可以被co包裹后自动执行?

co实现generator自动执行的条件

co的github说的很明白,需要yield后面的数据类型为:

promises

thunks (functions)

array (parallel execution)

objects (parallel execution)

generators (delegation)

generator functions (delegation)

最后两种类型是官方建议避免使用的。array或者object的每个子元素依然应该是promises或者thunks。了解promise

thunk在javascript中可以理解为,可以将一个进行一定操作并调用一个回调函数的函数(nodejs中很多,如:fs),拆分成两步。上面例子中的
thunkify
就是一个thunk,其声明如下:

function thunkify(fn){
return function(){
var args = new Array(arguments.length);
var ctx = this;

for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}

return function(done){
var called;

args.push(function(){
if (called) return;
called = true;
done.apply(null, arguments);
});

try {
fn.apply(ctx, args);
} catch (err) {
done(err);
}
};
};
}


执行
var readFile = thunkify(fs.readFile);
的时候,返回一个函数
readFile
,其接受一个参数,为要读取文件的地址,并再次返回一个函数,该函数的参数为读取文件完毕后要执行的回调函数,传入回调函数后读取操作才开始执行。thunk就是把回调函数的写法变成两次传参而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  co nodejs generator 异步