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

来源:互联网 发布:seo外包服务价格 编辑:程序博客网 时间:2024/05/14 19:16

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就是把回调函数的写法变成两次传参而已。

0 0
原创粉丝点击