CO库

co 库用于优化异步函数调用方式,支持promise和thunks方式。

安装

npm i  co thunkify

thunkify 库是对异步函数的再次封装,符合co规范。

使用例子

不采用co的代码:fuck

var fs = require("fs");

fs.readdir(".",function(err,rs){
   fs.readFile(rs[0],function(err,f1){
       console.log(f1);
       fs.readFile(rs[1],function(err,f2){
           console.log(f2);
           fs.readFile(rs[2],function(err,f3){
               console.log(f3);
           })
       })
   })
})

这段代码的意思是,查看当前目录下有多少文件,然后逐个读取,把读取的数据打印到终端,可笑的是,你还必须要知道到底有几个文件,如果我知道有3个,就调用三次 readFile异步函数,如果1000个,那就要...... 

下面用co库实现任意文件数:

var fs = require("fs");
var co = require("co");
var thunkify = require("thunkify");


// 包装异步函数,让其符合co规范。
var readdir = thunkify(fs.readdir);
var readFile = thunkify(fs.readFile);

co(function *(){

   // 得到当前目录下的文件名列表
   var fns = yield readdir(".");


   for(var i=0,len = fns.length;i<len;i++){
       var rs= yield readFile(fns[i]);
       console.log(rs);
   }

})();

我们会发现,co使用很简单, 只要用thunkify转换普通的异步函数,之后和同步调用基本一致。

下面我们自己编写一个,模拟异步的函数,并用co执行。

var co = require("co");
var thunkify = require("thunkify");

function fun(time,callback){
   setTimeout(function(){
       callback(null,"setTimeout time is - "+time);
   },time)
}

var func = thunkify(fun);

co(function* (){

   console.log(yield func(2000));
   console.log(yield func(1000));
   console.log(yield func(500));

})()

结果:

setTimeout time is - 2000
setTimeout time is - 1000
setTimeout time is - 500

根据结果,确实是按照顺序执行的,cool !

值得注意的是,在编写异步函数的回调函数时,要遵循function(err,arg0,args1 … )的方式,co还支持其他方式,这里不一一介绍,请参看 https://github.com/visionmedia/co 。有任何问题,可使用提问系统,在线提问。