Promise物件的resolve回撥函式和reject回撥函式使用
Promise是ES6中用來結局回撥地獄的問題的但是並不能幫我們減少程式碼量
-
Promise是一個建構函式 new Promise() 得到一個Promise一個例項
-
在Promise上有兩個函式分別是resolve(成功之後的回撥函式)和reject(失敗之後的回撥函式)
-
在Promise建構函式的prototype屬性上,有一個.then()方法,也就是隻要是Promise建構函式建立的例項,都可以訪問到.then()方法
-
如果Promise表示一個非同步操作,每當我們new一個Promise的例項,這個例項就表示一個具體的非同步操作
-
既然Promise建立的例項是一個非同步操作那麼這個非同步操作的結果只能有兩種狀態
-
狀態一:非同步執行成功 需要在內部呼叫,成功的回撥函式resolve 把結果返回給呼叫者
-
狀態二:非同步執行失敗了 需要在內部呼叫,成功的回撥函式reject把結果返回給呼叫者
-
由於Promise的例項是一個非同步操作,所以拿到操作結果後,無法使用return把操作結果返回給呼叫者,這個時候只能使用回撥函式的形式,來把成功或者失敗的結果返回給呼叫者
-
-
我們可以在new出來的Promise例項上,呼叫.then()方法【預先】為這個Promise一部操作,指定成功(resolve)和失敗(reject)回撥函式
實現原理:(以讀取檔案為例)
1 //這是一個具體的非同步操作,其中使用function 指定一個具體的非同步操作 2 var promise = new Promise(function () { 3//這個function 內部寫的就是具體的非同步操作 4 }) 5 //每當new一個Promise例項的時候,就會立即執行這個非同步操作中的程式碼 6 //如果不想立即執行需要放在一個函式中呼叫才執行 7 function getFile(fpath) { 8var promise = new Promise(function (resolve,reject) { 9fs.readFile(fpath,'utf-8',function (err,data) { 10if(err) { 11//console.log(err.message) 12reject(err) 13return false 14} 15//console.log(data); 16resolve(data) 17}) 18}); 19return promise 20 } 21 var p = getFile(path).then(function (data) { 22console.log(data) 23 },function (err) { 24console.log(err.message) 25 })
回撥地獄的寫法(瞭解即可)
getFile(path.join(__dirname,'./file/1.txt')).then((data)=>{ console.log(data); getFile(path.join(__dirname,'./file/2.txt')).then((data)=>{ console.log(data); getFile(path.join(__dirname,'./file/3.txt')).then((data)=>{ console.log(data); }) }) })
注意:回撥巢狀只會降低效率,並且如果需要讀取的檔案太多,不好排錯,在沒有將程式碼執行完畢之前你永遠不知道這段程式碼是在幹什麼
正確的寫法:
//在上一個.then中返回一個新的promise例項,可以繼續用下一個.then來處理 getFile('路徑1').then(function (data) { console.log(1,data); return getFile('路徑2') }).then(function (data) { console.log(2,data); return getFile('路徑3') }).then(function (data) { console.log(3,data); })
如果執行失敗了不想影響後續的promise的正常執行此時我們需要單獨為每一個promise通過.then指定一下失敗的回撥
getFile(path).then(function (data) { console.log(data) return getFile(path) },function (err) { console.log(err.message) return getFile(path) }).then(function (data) { console.log(data) return getFile(path) },function (err) { console.log(err.message) return getFile(path) })
不管是正確的回撥函式還是失敗的回撥函式都需要將下一個回撥函式所需要的物件return出去
如果前面的失敗了,則後面的就沒有繼續執行下去的意義,此時我們想實現一旦報錯則立即終止所有的promise的執行;
//在promise的最後使用catch .catch(function (err) { //catch如果前面有任何的promise執行失敗,則立即終止所有promise的執行並馬上進入catch去處理promise中丟擲異常 console.log('這是自己的處理方式:'+err.message) })