在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 !