用async 解放你的大脑
在js中,代碼嵌套和代碼回調(diào)非常常見,不僅編寫麻煩而且異常反人類。讓我等碼農(nóng)很是頭痛
function () {function () {function () {function () {//pass}}} }?這是一個(gè)常規(guī)的嵌套,如果每個(gè)function 的邏輯處理都比較多的話,會(huì)導(dǎo)致整個(gè)代碼非常長(zhǎng),不僅編碼困難,而且閱讀起來也是很是蛋疼, 這種情況在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!');});});} });?
?這是一個(gè)異步嵌套代碼,先檢查文件是否存在,不存在則把某個(gè)文件的內(nèi)容提取出來然后在寫入另外一個(gè)文件,看起來還算好,但是遺憾的是這樣的編寫無法把錯(cuò)誤 return 到頂層例如 fs.writeFile return 的err 無法 在fs.stat 中接受到。如果想在外層接受到內(nèi)部拋出的錯(cuò)誤你會(huì)見到非常反人類的代碼,如下
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 ,這樣惡心的代碼 實(shí)在無法讓人喜歡,但是不得已為之,如果想在外層接受錯(cuò)誤信息在沒有async 之前 常規(guī)的寫法就是上面那樣 把異步代碼包括回調(diào)抽出來成為一個(gè)單一的方法 然后調(diào)用,這樣會(huì)導(dǎo)致代碼的結(jié)構(gòu)更加臃腫 更加反人類,看了一眼就不想看第二眼的! 不僅編寫的痛苦,維護(hù)的更痛苦
但是有了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!');});} ]);改變之后的結(jié)構(gòu)就像同步那樣編寫異步回調(diào)代碼,不僅結(jié)構(gòu)清晰而且代碼編寫非常簡(jiǎn)單,寫完之后頓時(shí) 頭不痛了,腿不酸了,感覺時(shí)間如此美好了 !這等利器真是解放我等碼農(nóng)的大殺器啊! 當(dāng)然還有老趙的 wind.js 更符合。net 4.5 中async 和await 的寫法 ,很是犀利
async 傳送門 https://github.com/caolan/async#waterfall
wind.js 傳送門 http://windjs.org/cn/
當(dāng)然在nodejs 鼎鼎大名的 async 不會(huì)只有這點(diǎn)功能,奈何小弟才疏學(xué)淺,疏于皮毛,僅會(huì)于此,如有任何錯(cuò)誤,歡迎拍磚
enjoy !
轉(zhuǎn)載于:https://www.cnblogs.com/trigged/archive/2013/02/22/2921885.html
總結(jié)
以上是生活随笔為你收集整理的用async 解放你的大脑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#23种设计模式WebCast讲解笔记
- 下一篇: 【python数据分析】亚太地区的商学院