什么是Promise?
Promise是一個構造函數,其原型上有 then、catch方法,還有reslove,reject等靜態方法。通過創建Promise實例,可以調用Promise.prototype上的then、catch方法。
Promise的作用
MDN對Promise的描述:
Promise能夠將異步操作最終成功返回值或者失敗原因和相應的處理程序關聯起來。 這樣使得異步方法可以像同步方法那樣返回值:異步方法並不會立即返回最終的值,而是會返回一個 Promise,以便在未來某個時候把值交給使用者。
簡單來說就是:使異步方法也能夠根據其操作最終結果是成功還是失敗的具體情況綁定不同的后續處理事件
Promise的使用
一個 Promise
必然處於以下幾種狀態之一:(其中fulfilled狀態和rejected狀態也稱作settled狀態)
1、pending : 初始狀態,既沒有被兌現,也沒有被拒絕。
2、fulfilled : 意味着操作成功完成。
3、rejected : 意味着操作失敗。
處於初始狀態(pending)的Promise,最終要么成功(fulfilled )要么失敗(rejected ),無論成功還是失敗,通過then方法調用相關處理程序。
在實例化Promise的時候需要傳入 resolve 和 reject 這兩個函數作為其參數,當異步任務順利完成且返回結果值時,會調用 resolve
函數;而當異步任務失敗且返回失敗原因(通常是一個錯誤對象)時,會調用reject
函數。
then函數中有兩個參數,如下:
promise.then(successCallback, failureCallback);
第一個參數是狀態變為成功后應該執行的回調函數,第二個參數是狀態變為失敗后應該執行的回調函數。
具體使用例子:
let testPromise = new Promise((resolve,reject)=>{ setTimeout(function(){ // resolve('成功!') //狀態為成功,傳的參數作為then函數中成功函數的實參 reject('失敗!') //狀態為失敗,傳的參數作為then函數中失敗函數的實參 }, 1000); }); testPromise.then((data)=>{ console.log('success'+data) },(err)=>{ console.log('fail'+err) })
打印結果 "fail失敗!"
其中 data 和 err 就是上面調用 resolve 和 reject 方法傳入的值。
Promise鏈式調用
由上面例子可以知道 Promise鏈式調用可以實現多個異步操作連續執行,且上個操作執行成功后,執行下一個操作,並包含上個操作返回的結果。
因此鏈式調用可以很好解決 回調地獄 問題,避免了一層又一層的嵌套,雖然代碼量可能沒有減少,但是代碼結構更加清晰、易讀。
回調地獄例子:
toDoA(function(result) { toDoB(result, function(newResult) { toDoC(newResult, function(finalResult) { console.log('最終結果: ' + finalResult); }, failureCallback); }, failureCallback); }, failureCallback);
使用鏈式回調:
toDoA() .then(result => toDoB(result)) .then(newResult => toDoC(newResult)) .then(finalResult => { console.log(`'最終結果': ${finalResult}`); }) .catch(failureCallback);
catch(failureCallback)可以看做then(null,failureCallback)
更多使用方法可以參考MDN