Promise的含義
promise是異步編程的一種解決方法。
所謂promise,簡單說是一個容器,里面保存着某個未來才會結束的事件(通常是一個異步操作)的結果,從語法上說,promise是一個對象,從它可以獲取異步操作的消息,promise提供了統一的API,各種異步操作都可以用同樣的方法進行處理。
Promise對象的特點
(1)對象的狀態不受外界影響,promise對象代表一個異步操作,有三種狀態,pending(進行中)、fulfilled(已成功)、rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態,這也是promise這個名字的由來“承若”;
(2)一旦狀態改變就不會再變,任何時候都可以得到這個結果,promise對象的狀態改變,只有兩種可能:從pending變為fulfilled,從pending變為rejected。這時就稱為resolved(已定型)。如果改變已經發生了,你再對promise對象添加回調函數,也會立即得到這個結果,這與事件(event)完全不同,事件的特點是:如果你錯過了它,再去監聽是得不到結果的。
有了Promise對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise對象提供統一的接口,使得控制異步操作更加容易。
Promise也有一些缺點。首先,無法取消Promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設置回調函數,Promise內部拋出的錯誤,不會反應到外部。第三,當處於pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
Promise的用法
是一個構造函數,這個構造函數里有兩個參數,分別是:resolve(成功之后的回調函數)、reject(失敗之后的回調函數)。
因為promise表示的是一個異步操作,每當我們new一個promise實例,就表示一個具體的異步操作,那么這個異步操作的結果就只能有兩種狀態:成功/失敗,兩者都需要回調函數resolve/reject返回。所以內部拿到操作的結果后,無法使用return把操作結果返回給調用者,這時候只能用回調函數的形式來把成功或失敗的結果返回給調用者。
promise實例生成以后,可以用then方法分別指定resolved狀態和rejected狀態的回調函數
then方法可以接受連個回調函數作為參數,第一個回調函數是promise對象的狀態變為resolved時調用,第二個回調函數是promise對象的狀態變為rejected時調用,其中,第二個函數是可選的,不一定要提供,這兩個函數都接受promise對象傳出的值作為參數;
*通過。then指定回調函數的時候,成功的回調函數必須傳,失敗的回調函數可以勝利。
如果前面的promise執行失敗,不詳影響后續操作終止,捕獲異常的兩種方式:
①可以為每個promise指定失敗回調;
function(err){
console.log(……)
})
②最后加catch(function(err){
console.log(……)
})//表示如前面有任意一個有報錯,立即報錯,並終止后面的;如果前面無報錯,前面正常執行。
promise對象實現ajax操作的例子
getJSON是對XMLHTTPRequest對象的封裝,用於發出一個針對JSON數據的HTTP請求,並且返回一個promise對象,需要注意的是,在getJSON內部,resolve函數和reject函數調用時,都帶有參數;
如果調用resolve函數和reject函數時帶有參數,那么他們的參數會被傳遞給回調函數,reject函數的參數通常是Error對象的實例,表示拋出的錯誤,resolve函數的參數除了正常的值以外,還可以是另一個promise實例;