用async 解放你的大脑
在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 解放你的大脑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#23种设计模式WebCast讲解笔记
- 下一篇: 使用data()方法缓存数据