Promise的含義
promise是異步編程的一種解決方法。
所謂promise,簡單說是一個容器,裏面保存着某個將來纔會結束的事件(一般是一個異步操做)的結果,從語法上說,promise是一個對象,從它能夠獲取異步操做的消息,promise提供了統一的API,各類異步操做均可以用一樣的方法進行處理。
Promise對象的特色
(1)對象的狀態不受外界影響,promise對象表明一個異步操做,有三種狀態,pending(進行中)、fulfilled(已成功)、rejected(已失敗)。只有異步操做的結果,能夠決定當前是哪種狀態,任何其餘操做都沒法改變這個狀態,這也是promise這個名字的由來「承若」;
(2)一旦狀態改變就不會再變,任什麼時候候均可以獲得這個結果,promise對象的狀態改變,只有兩種可能:從pending變爲fulfilled,從pending變爲rejected。這時就稱爲resolved(已定型)。若是改變已經發生了,你再對promise對象添加回調函數,也會當即獲得這個結果,這與事件(event)徹底不一樣,事件的特色是:若是你錯過了它,再去監聽是得不到結果的。ajax
有了Promise對象,就能夠將異步操做以同步操做的流程表達出來,避免了層層嵌套的回調函數。此外,Promise對象提供統一的接口,使得控制異步操做更加容易。編程
Promise也有一些缺點。首先,沒法取消Promise,一旦新建它就會當即執行,沒法中途取消。其次,若是不設置回調函數,Promise內部拋出的錯誤,不會反應到外部。第三,當處於pending狀態時,沒法得知目前進展到哪個階段(剛剛開始仍是即將完成)。promise
Promise的用法異步
是一個構造函數,這個構造函數裏有兩個參數,分別是:resolve(成功以後的回調函數)、reject(失敗以後的回調函數)。異步編程
由於promise表示的是一個異步操做,每當咱們new一個promise實例,就表示一個具體的異步操做,那麼這個異步操做的結果就只能有兩種狀態:成功/失敗,二者都須要回調函數resolve/reject返回。因此內部拿到操做的結果後,沒法使用return把操做結果返回給調用者,這時候只能用回調函數的形式來把成功或失敗的結果返回給調用者。函數
promise實例生成之後,能夠用then方法分別指定resolved狀態和rejected狀態的回調函數
對象
then方法能夠接受連個回調函數做爲參數,第一個回調函數是promise對象的狀態變爲resolved時調用,第二個回調函數是promise對象的狀態變爲rejected時調用,其中,第二個函數是可選的,不必定要提供,這兩個函數都接受promise對象傳出的值做爲參數;blog
*經過。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實例;