所谓回调函数,就是把任务的第二段单独写在一个函数里边,等到从新执行这个任务的时候,就直接调用这个函数。异步
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); }) })