解決回撥地獄問題
阿新 • • 發佈:2019-03-09
比如我們現在有個讀取檔案的需求,那麼用nodejs,剛開始我們的程式碼會這麼寫
var fs=require('fs'); var path=require('path'); function readFile(fpath){ fs.readFile(fpath,'utf-8',(err,data)=>{ if(err) throw err; return data; }) } let res=readFile('App.vue'); //這裡列印為undefined 因為fs.readFile是非同步的,主執行緒在遇到非同步函式時,會將非同步任務放到佇列中,然後 //繼續執行,所以這裡得到undefined console.log(res);
解決思路1:利用回撥函式,獲取非同步結果
function readFile(fpath,callback){
fs.readFile(fpath,'utf-8',(err,data)=>{
if(err) throw err;
throw new Error('er hui');
callback(data);
})
}
//但這裡又存在一個問題,如果這個函式經常發生異常,這樣的話,通過回撥還是拿不到結果的,
//我們應該將處理的結果告訴給呼叫者,由呼叫者決定要如果處理結果,包括異常結果
readFile('App.vue',result=>{
console.log(result)
});
改進如下,將回調函式定義成有兩個引數:
function readFile(fpath,callback){
fs.readFile(fpath,'utf-8',(err,data)=>{
if(err) callback(err);
callback(null,data);
})
}
//但這裡又存在一個問題,如果這個函式經常發生異常,這樣的話,通過回撥還是拿不到結果的,
//我們應該將處理的結果告訴給呼叫者,由呼叫者決定要如果處理結果,包括異常結果
readFile('App.vue2',(err,result)=>{
if(err) throw err;
console.log(result)
});
//改進思路3
//我們這樣寫是沒問題了,但對於初學者來說可能有點不好理解,這裡我們可以規定指定的函式來處理成功的結果和異常結果
function readFile(fpath,succ,fail){
fs.readFile(fpath,'utf-8',(err,data)=>{
if(err) return fail(err);
succ(data);
})
}
readFile('App.vue',function (data) {
console.log('succ');
console.log(data);
},function (err) {
console.log('fail');
console.log(err);
});