github co 项目传送门

https://github.com/tj/co

个人比较喜欢的,用co库的姿势

测试用函数

function fun1(arg1,arg2,cb){//dosomthingcb(null,arg1+'retval'+arg2);
}function fun2(arg1,cb){//dosomthingcb(null,arg1+'retval2');
}function fun3(arg1,arg2,cb){//dosomthingcb(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');

tj大神的 co库.优雅的解决 nodejs callback无限嵌套(回调地狱)问题相关推荐

  1. 酷派大神f1,酷派大神f2 无法打log的解决方法。

    我发现我的手机无法再eclipse里面输出自己打的log.i等log,一开始还以为是我手机root或刷过机的问题,在百度上找解决方法,并尝试了好久啊啊啊啊啊. 最终非常偶然找到了解决的方法: 酷派大神 ...

  2. TJ 大神 与 node

    t j  dj tj 转载于:https://www.cnblogs.com/dhsz/p/9013107.html

  3. 流式布局使用鸿洋大神写的库:com.hyman:flowlayout-lib:1.1.2

    在项目中一般都会用到流式布局 布局文件 <com.zhy.view.flowlayout.TagFlowLayoutandroid:id="@+id/id_flowlayout&quo ...

  4. python怎么搜索文献_学习帖|大神是如何用Python高效解决文献搜索和数据处理!?...

    #研究生期间,你被逼得有多绝望? ◆ 写论文 一起床一睁眼:今天一定要写完这一部分 一支烟一杯茶:一个introduction写一天 一躺下一闭眼:今天都写了些什么玩意 ◆ 面对老板 交稿前脑补各种挨 ...

  5. cf登录游戏只显示服务器的字体,cf辅助灭天大神修复文件字体花样请求解决方法...

    cf冰易辅助小编解说硬盘分区魔术师解答方法 在操作体系的历程中会碰见林林总总的问题,比方最常常见文件字体花样请求的状况,许多用户都是初次遇到文件字体花样请求这类状况,所以人人都没有好的处置惩罚要领,怎 ...

  6. 删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!

      视学算法报道   编辑:好困 袁榭 [新智元导读]在开源程序界惹出「删库跑路」大新闻的开发者Marak Squires,最近发声:「人无完人,编程错误而已,GitHub你就不用再封我号了嘛!」 2 ...

  7. 交叉编译 for arm-linux-gcc... no,QT4.8.6、tslib库移植到arm上配置出错!求大神指点

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 操作系统:Ubuntu14.04 LTS ; Qt版本:Qt4.8.6 for embedded 交叉编译器:arm-linux-gcc-v6-vfp-2 ...

  8. c语言百题大战之求n的阶乘,网易大神第五人格百题大战题库下载-第五人格百题大战答案完整版下载v1.52.7_86PS软件园...

    网易大神第五人格百题大战题库答案完整版是款非常实用的辅助工具.在这款工具中将会为玩家们带来最新最准确的答案供玩家们完成所有的问题.在第五人格百题大战题库中玩家们只需要找到对应的题目就可以找到自己想要的 ...

  9. python大神作品_掌握了这24个顶级Python库,你就是大神!

    全文共11815字,预计学习时长24分钟 Python有以下三个特点: · 易用性和灵活性 · 全行业高接受度:Python无疑是业界最流行的数据科学语言 · 用于数据科学的Python库的数量优势 ...

最新文章

  1. AOP日志-域对象创建与基本操作介绍
  2. Storm 03_Storm 架构设计
  3. 在RHEL6.2上,将一个分区开机自动挂载
  4. python的变量名必须以什么开头_python以下划线开头的变量名含义
  5. 借钱,一定要有还钱的素质
  6. 双十一,单身狗除了买买买,还能做什么?
  7. 计算机word数字逆序输出,如何让word中的内容倒序排列
  8. pytorch入门_PyTorch入门
  9. python列表推导式生成随机数_Python:列表推导式/生成器推导式
  10. FastSpring.NET V2.05 final 发布[集成Spring.net NHibernate Ajax]
  11. Git基本用法(一)
  12. spring2.5与jdk1.7冲突
  13. 有什么好用的电脑录音软件?
  14. R400安装Windows2003网卡驱动
  15. SameSite Cookie
  16. CVPR2021投稿要求
  17. win10如何隐藏任务栏
  18. 计算机系统运行太慢,如何解决电脑运行速度慢
  19. 外设键盘的win键和alt键功能互换
  20. Graph Embedding模型【Node2Vec】学习笔记

热门文章

  1. 灰狼优化算法--简单易懂附python代码
  2. git stash暂存修改
  3. ZK实现SASL认证+Kafka连接ZK
  4. ubuntu Qt 找不到 -lGL
  5. 【ESP 保姆级教程】 疯狂传感器篇 —— 案例:ESP8266 + MQ3酒精传感器 + webserver(局域网内曲线变化图)+ 自定义微信告警
  6. 1055 mysql_mysql8.0.1 报错1055
  7. 批量查询快递物流,自动过滤重复的单号
  8. 通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺
  9. Lipschitz函数相关
  10. noi国家集训队论文分类