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