Promise實際上不是什麼新鮮的東西,他是異步編程的一種解決方案,相較於傳統的回調函數和事件來說更靈活和更節約時間,在ES6中他得到了規範化
在ES6中,Promise往小了說是一個容器,保存着不知道什麼時候會結束的事件的結果。他是一個對象,可以取得異步操作的消息
他有兩個特點:
- 對象的狀態不受外界影響。他代表一個異步操作,只有三種狀態,pending(進行中)、fulfilled(已成功)和失敗(reject),從外界無法改變其狀態
- 一旦狀態改變,就不會再改變,任何時候都會獲得這個結果,因此他的結果只有兩種,要麼成功要麼失敗,狀態會一直凝結,等待來取他的那個人
他有三個缺點:
- 無法取消Promise,一旦新建就會立即執行,不能取消
- 必須要有回調函數,不然會內部報錯
- 當處於pending狀態時,無法判斷此時的結果狀態
基本用法
Promise是一個構造函數,用來生成Promise實例。其參數是resolve(成功時的結果)和reject(失敗時的錯誤),這是有JS引擎提供的。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 異步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
實例生成後,使用then方法,分別指定兩種狀態的處理結果的回調函數
promise.then(function(value) {
// success
}, function(error) {
// failure
});
方法
then()
then方法是定義再原型Promise.prototype上的,其作用是狀態改變時的回調函數。在實際應用中,可以採用鏈式的then調用多個Promise對象
catch()
catch方法也是定義再原型Promise.prototype,其作用是用於指定發生錯誤時的回調函數,用於捕獲錯誤
finally()
finally方法也是定義再原型Promise.prototype,他的作用是不管最後的狀態如何,都會執行的操作,該方法在ES2018中引入,這個方法沒有任何參數,其本質是then()的特例
all()
用於多個Promise實例,包裝成一個新的Promise實例
race()
將多個 Promise 實例,包裝成一個新的 Promise 實例。
resolve()
將對象轉爲Promise對象,
reject()
返回一個新的Promise實例,該實例的狀態是rejected