tj大神的 co库.优雅的解决 nodejs callback无限嵌套问题
2016-08-05 22:05
204 查看
github co 项目传送门
https://github.com/tj/co个人比较喜欢的,用co库的姿势
测试用函数
function fun1(arg1,arg2,cb){ //dosomthing cb(null,arg1+'retval'+arg2); } function fun2(arg1,cb){ //dosomthing cb(null,arg1+'retval2'); } function fun3(arg1,arg2,cb){ //dosomthing cb(null,arg1+'retval3'+arg2); }
正常的nodejs
function testFunNormal(targ1,cb){ fun1(targ1+1,targ1+5,function(err,ret){ if(err){ cb(err); return; } fun2(ret+10,function(err,ret){ if(err){ cb(err); return; } fun3(ret+10,ret+5,function(err,ret){ if(err){ cb(err); return; } cb(null,ret+20); }) }) }) } //test normal testFunNormal(666,function(err,ret){ console.log('err:',err,'ret:',ret); }); //err: null ret: 667retval67110retval210retval3667retval67110retval2520
使用 tj大神的co库后
var co = require('co'); function testCo(targ1,cb){ co(function*(){ let ret = yield (done)=>{fun1(targ1+1,targ1+5,done)}; ret = yield (done)=>{fun2(ret+10,done)}; ret = yield (done)=>{fun3(ret+10,ret+5,done)}; cb(null,ret+20); }).catch(cb) } testCo(666,function(err,ret){ console.log('err:',err,'ret:',ret); }); //err: null ret: 667retval67110retval210retval3667retval67110retval2520
是不是感觉天空突然开阔了 ^ ^
附上一些 toy code'use strict'; const co = require('co'); function sleep(ms) { return function(done){ setTimeout(function(){ done(0,1111,22222) }, ms); } } function *work() { var [rr1,rr2] = yield sleep(60); console.log('rrr',rr1,rr2); return 'yay'; } function testCo1(){ co(function *(){ var a = yield work; var b = yield work; var c = yield work; console.log('yay', a); console.log('yay', b); console.log('yay' , c); var res = yield [work, work, work]; console.log(['yay', 'yay', 'yay'], res); return 'wwwhat' }).then(function(val){ console.log('aaaa val:',val); },function(err){ console.log('aaa err:',err); }); } function testco2(){ co(function *(){ let ggg = yield function(done){ setTimeout(function(){ done(0,'hahfda'); },1000); }; console.log('ggg',ggg); let aaa = yield (done)=>{ setTimeout(()=>{ console.log('aafun ggg:',ggg); done(null,'ggret'); },1000) }; console.log('aaaa:',aaa); return 'ret val'; }).then(function(val){ console.log('aaaa val:',val); },function(err){ console.log('bbbb err:',err); }).catch(function(err){ console.log('err err:',err); }); } function testco3(){ var aa = co(function*(){ console.time('cot'); console.time('111cot'); let ggg = yield function(done){ done(0,'hahfda'); }; console.timeEnd('111cot'); console.log('ggg',ggg); let aaa = yield (done)=>{ done(null,'ggret'); }; console.log('aaaa:',aaa); console.timeEnd('cot'); }); console.time('nocot'); function getggg(done){ done(0,'hahfda'); } getggg(function(err,ggg){ console.log('ggg',ggg); function getaaa(done){ done(null,'ggret'); } getaaa(function(err,aaa){ console.log('aaaa:',aaa); }) return 'ret val'; }); console.timeEnd('nocot'); } function isObj1(val){ return Object == val.constructor; } function isObj2(val){ return 'object' == typeof val; } var obj = {}; console.time('isObj1'); for (let i =0;i<500000;i++){ isObj1(obj); } console.timeEnd('isObj1'); console.time('isObj2'); for (let i =0;i<500000;i++){ isObj2(obj); } console.timeEnd('isObj2');
相关文章推荐
- 正确优雅的解决用户退出问题——JSP和Struts解决方案 (转)
- 如何在mysql中优雅的解决精确到毫秒的问题?
- 刚刚安装好的Eclipse,导入一个Maven项目之后POM文件的第一行一直报错,看了好多帖子也没解决,会是版本问题吗,请各路大神帮忙解决一下,万分感谢!!!
- HL大神教你如何解决 a+b 问题
- 优雅而高效的解决程序控制动画贴图问题
- 正确优雅的解决用户退出问题
- url编码的问题解决方案;转码方法不可重入,需要优雅的方案来解决,否则只能靠约定式编程。
- 正确优雅的解决用户退出问题——JSP和Struts解决方案 选择自 zaowei21 的 Blog
- 正确优雅的解决用户退出问题——JSP和Struts解决方案
- 优雅绝妙的Javascript跨域问题解决方案
- Android优雅的方式解决软键盘遮挡按钮问题
- 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享
- 正确优雅的解决用户退出问题——JSP和Struts解决方案
- Neurons字幕组 | 2分钟看强化学习如何优雅地解决地形穿越问题(附论文下载)
- 使用正则表达式优雅的解决SpringMVC时间转换问题
- [LeetCode]LRU Cache有个问题,求大神解答【已解决】
- 酷派8279F1大神 360手机助手导入不了通讯录的问题解决过程
- 关于遇到问题的解决方法(仅此献给初学者吧,我工作还没两年,这点经验对于大神,不值一谈的)
- 急求大神帮忙解决的问题
- 解决IE(IE6/IE7/IE8)不兼容HTML5标签的问题[转自大神]