所謂回調函數,就是把任務的第二段單獨寫在一個函數裏邊,等到從新執行這個任務的時候,就直接調用這個函數。異步
fs.readFile('某文件', function (err, data) { if (err) throw err; console.log(data); });
這是一個錯誤優先的回調函數(error-first callbacks),這也是Node.js自己的特色之一async
回調常見的問題:函數
1.異常處理ui
try{ //TODO }catch(e){ //TODO }
異步代碼時try catch
再也不生效spa
let async = function(callback){ try{ setTimeout(function(){ callback(); },1000) }catch(e){ console.log('捕獲錯誤',e); } } async(function(){ console.log(t); });
由於這個回調函數被存放起來了,直到下一個事件循環的時候纔會取出,try只能捕獲當前循環內的異常面對callback異步無能爲力。code
Node在處理異常有一個約定,將異常做爲回調的第一個實參傳回,若是爲空表示沒有出錯。blog
async(function(err,callback){ if(err){ console.log(err); } });
異步方法也要遵循兩個原則:事件
let async = function(callback){ try{ setTimeout(function(){ if(success) callback(null); else callback('錯誤'); },1000) }catch(e){ console.log('捕獲錯誤',e); } }
2.回調地域回調函數
異步多級依賴的狀況下嵌套的很是深,代碼難以閱讀和維護io
let fs = require('fs'); fs.readFile('template.txt','utf8',function(err,template){ fs.readFile('data.txt','utf8',function(err,data){ console.log(template+' '+data); }) })