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
- Co-使用co自动化执行Generator函数
- Generator函数执行器-co函数库源码解析
- co与generator
- co
- 新手如何玩co.generator
- nodejs co generator 调用另外一个generator
- nodejs co-sleep 使用
- use generator and co in mocha
- co核心代码剖析--promise与ES6 generator结合
- ES6新特性:Generator以及衍生NPM库CO入门
- ECMAScript6 generator 精巧用法,自己动手实现 co 框架
- Tiffany&Co
- CO-OM
- SAP CO
- . CO知识点
- Co.,Ltd.
- Co-prime
- Co-variance
- android中保存Bitmap图片到指定文件夹中的方法
- C++调用Python之环境配置
- [字符串] 判断是否回纹串
- 275. H-Index II
- 面向对象
- Co-使用co自动化执行Generator函数
- Mac 下如何解压 bin 文件
- How to fix process system isn’t responding on Android?
- ajax服务跨域问题解决办法
- 关于为什么使用MQ中间件的问题
- Codeforces Round #350 (Div. 2) B. Game of Robots __ interesting
- 306. Additive Number
- 初心若雪
- [UnityShader3]热扭曲效果