關於回調函數和回調函數常出現的問題

所謂回調函數,就是把任務的第二段單獨寫在一個函數裏邊,等到從新執行這個任務的時候,就直接調用這個函數。異步

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);
})
})
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息