在js中,代码嵌套和代码回调非常常见,不仅编写麻烦而且异常反人类。让我等码农很是头痛

function () {function () {function () {function () {//pass}}}
}

这是一个常规的嵌套,如果每个function 的逻辑处理都比较多的话,会导致整个代码非常长,不仅编码困难,而且阅读起来也是很是蛋疼, 这种情况在js 中还是比较好的情况 ,还有非常恶劣的情况 ,考虑下在 异步嵌套的情况

var path = './async.txt';
// check if async.txt exists
fs.stat(path, function (err, stats) {if (err)return errif (stats == undefined) {fs.readFile(__filename, function (err, content) {if (err)return errvar code = content.toString();fs.writeFile(path, code, function (err) {if (err)return errconsole.log('async.txt created!');});});}
});

这是一个异步嵌套代码,先检查文件是否存在,不存在则把某个文件的内容提取出来然后在写入另外一个文件,看起来还算好,但是遗憾的是这样的编写无法把错误 return 到顶层例如 fs.writeFile return 的err 无法 在fs.stat 中接受到。如果想在外层接受到内部抛出的错误你会见到非常反人类的代码,如下

function start (path,filePath){stats(path,function(err,stat){if (err)                       return err;        else if(stat == undefined){reads(filePath,function(err,data){if (err)return err;var code = data.toString();writes(code,function(err,result){if (err)return errconsole.log('async.txt created!');})                })}})
}function stats (path, fn) {fs.stat(path, function (err, stats) {if (err)fn(err, null);fn(null, stats);});
}function reads (filePath,fn){fs.readFile(filePath,function(err,content){if (err)fn(err, null);fn(null, content);});
}function writes(data,fn){fs.writeFile(filePath,data,function(err,content){if (err)fn(err, null);fn(null, content);});
}

wtf ,这样恶心的代码 实在无法让人喜欢,但是不得已为之,如果想在外层接受错误信息在没有async 之前 常规的写法就是上面那样 把异步代码包括回调抽出来成为一个单一的方法 然后调用,这样会导致代码的结构更加臃肿 更加反人类,看了一眼就不想看第二眼的! 不仅编写的痛苦,维护的更痛苦

但是有了async 一切就不同了

var fs = require('fs');
var async = require('async');var path = './async.txt';
async.waterfall([// check if async.txt existsfunction(cb) {fs.stat(path, function(err, stats) {if (stats == undefined) cb(null);else console.log('async.txt exists');});},// read the contents of this filefunction(cb) {fs.readFile(__filename, function(err, content) {var code = content.toString();cb(null, code);});},// write the content to async.txtfunction(code, cb) {fs.writeFile(path, code, function(err) {if (err) throw err;console.log('async.txt created!');});}
]);

改变之后的结构就像同步那样编写异步回调代码,不仅结构清晰而且代码编写非常简单,写完之后顿时 头不痛了,腿不酸了,感觉时间如此美好了 !这等利器真是解放我等码农的大杀器啊! 当然还有老赵的 wind.js 更符合。net 4.5 中async 和await 的写法 ,很是犀利

async 传送门 https://github.com/caolan/async#waterfall
wind.js 传送门 http://windjs.org/cn/

当然在nodejs 鼎鼎大名的 async 不会只有这点功能,奈何小弟才疏学浅,疏于皮毛,仅会于此,如有任何错误,欢迎拍砖
enjoy !

转载于:https://www.cnblogs.com/trigged/archive/2013/02/22/2921885.html

用async 解放你的大脑相关推荐

  1. 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

    数百种编程语言,各有优劣,各自也都有自己最为适用的场景.那么就科学计算领域而言,主流的 MATLAB.Julia.Python 会有哪些最为独特的优势呢?又存在哪些让开发者无力的缺陷?在本文中,我们将 ...

  2. 使用Kotlin写脚本

    前言 Kotlin不仅可以用来写Android,也可以写后端,Desktop桌面程序,脚本(和未来的ios,网页,native等) 比如开发时使用Gradle的build.gradle也可以使用kot ...

  3. winform checkbox要点击两次_开源C# Winform控件库SunnyUI强力推荐

    本站(https://dotnet9.com)曾介绍过一款Winform开源控件库<HZHControls>,文章发布后不少朋友热情的咨询相关控件库信息,由此看来Winform在大家心中的 ...

  4. 开源C# Winform控件库《SunnyUI》强力推荐

    本站(https://dotnet9.com)曾介绍过一款Winform开源控件库<HZHControls>,文章发布后不少朋友热情的咨询相关控件库信息,由此看来Winform在大家心中的 ...

  5. 那些曾经拥有的最大快乐,都是好奇心的结果

    ▲   点击查看 对于孩子们来说,强烈的好奇心和求知欲,是一种本能.在他们懵懵懂懂长大的过程中,总是对周围的世界充满着各种各样的疑问: "叶子为什么是绿色的?" "为什么 ...

  6. java姑娘_初识java这个小姑娘(二)

    正版疯狂java讲义第5版编程教材 76.5元 (需用券) 去购买 > 妙解垃圾回收机制 周一,早高峰!!! 五个字,说尽心中的绝望!!! 一段考验一个人耐力.智力.开车技术以及脾气的路. 我把 ...

  7. 计算机语言史话论文,【论文节选】自然语言处理发展历史。

    说实话看完文章有点失望,作者带有一贯的学术吹嘘风,就像吹嘘云计算,物联网等等.谈到现状,只字不提问题,一句话"一旦自然语言处理的研究获得成功,那么机器将能够进行思考,人类将得到继工业革命后的 ...

  8. Hadoop 生态系列之 Mapreduce

    阅读文本大概需要 5 分钟.文章稍长,建议收藏慢慢看. 目前 Hadoop 系列文章的规划就是这样,持续补充完善中- 同时可以访问 https://data.cuteximi.com Hadoop 生 ...

  9. 测试之全流程质量保证

    一.全流程质量保证 测试,只是项目过程中的一个阶段:我们不是软件的生产者,但是我们是软件质量的守护者.为了保证我们的产品质量,不能完全依赖于测试,或者依赖于开发:因为产品的质量不是依靠一个团队或一个阶 ...

最新文章

  1. 「自然语言处理NLP」的“高光时刻” --- 28篇标志性论文
  2. Little Sub and Balloons
  3. boost::spirit模块实现任意元组的解析器的测试程序
  4. 用Python画中国地图(二)
  5. 智慧园区-楼宇建模技巧之【建楼篇】
  6. 续——《RedHat/Fedora等非ubuntu的Linux系统星空极速netkeeper拨号上网 》
  7. TokenInsight:BTC新增人气缺乏,多头持仓量持续上升
  8. python应用于人工智能的代码_【python量化】人工智能技术在量化交易中应用的开源项目...
  9. Scala中class、object、case class、case object区别
  10. 统计挖掘那些事(五)--(理论+案例)如何通俗地理解极大似然估计?
  11. 手游修改 wpe封包 fiddler抓包 逆向破解 gg修改 哪种最厉害?
  12. 从人体3D建模和测量入手,云之梦要用虚拟试衣解放量体师和服装导购员
  13. 怎么看服务器cpu温度命令_ubuntu 命令行下查看及监测CPU温度的方法
  14. 电脑连接android手机测试,关于如何将手机画面投屏到PC的测试(Android)
  15. springcloud中feign调用的权限认证
  16. 04-Spark入门
  17. 分享一个大佬的网站,获取法定节假日
  18. 外卖订单量预测异常报警模型实践
  19. 总结一下使用Emgucv的经验和经历
  20. 利用茉莉机器人接口开发一个简单的安卓机器人app

热门文章

  1. 公司应该如果管理员工?
  2. Category 的一些事
  3. 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计
  4. 2016-01-17
  5. 【 2013华为杯编程大赛成都第三组前两题试题及答案】
  6. redhat6 使用raid5的系统安装
  7. gentoo ffmpeg+mencoder快速搭建视频处理系统笔记
  8. 超全Typora快速入门
  9. python substr_python数据分析-数据对象(一)
  10. np.random.seed(0)作用