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就是把回调函数的写法变成两次传参而已。
相关文章推荐
- 异步流程控制:7 行代码学会 co 模块
- CISCO交换机概览
- 攻击CISCO路由器
- ruby实现的一个异步文件下载HttpServer实例
- 使用ruby部署工具mina快速部署nodejs应用教程
- C#异步绑定数据实现方法
- 科学知识:同步、异步、阻塞和非阻塞区别
- 探讨Ajax中同步与异步之间的区别
- C#中异步回调函数用法实例
- Google官方支持的NodeJS访问API,提供后台登录授权
- 浅谈Nodejs观察者模式
- nodejs教程之环境安装及运行
- nodejs中的fiber(纤程)库详解
- 基于NodeJS的前后端分离的思考与实践(五)多终端适配
- 基于NodeJS的前后端分离的思考与实践(二)模版探索
- 实例详解Nodejs 保存 payload 发送过来的文件
- 我的NodeJs学习小结(一)
- Node.js 应用跑得更快 10 个技巧
- nodejs中实现sleep功能实例