1. 定義:Promise是抽象異步處理對象以及對其進行各類操做的組件,它把異步處理對象和異步處理規則採用統一的接口進行規範化。ajax
2. ES6 Promises 標準中定義的API:數組
a) Constructor:採用new來實例化,
var promise = new Promise(function(resolve, reject) {…});promise
b) Instance Method:使用then方法設置成功(resolve)和失敗(reject)時的回調函數, 異步
promise.then(onFulfilled, onRejected),ide
promise.catch(onRejected),其中,catch只是then的別名而已;函數
c) Static Method:一些其餘的輔助方法,好比all(),resolve()。spa
3. Promise 狀態。三種狀態:Pending(初始化)、Fulfilled和Rejected。在then後執行的函數能夠確定地說只會被調用一次。3d
promise對象被 resolve 時的處理 onFulfilledorm
promise對象被 reject 時的處理 onRejected 對象
圖1. Promise調用的執行過程
4. Resolve方法:
a) 靜態方法Promise.resolve(value)能夠認爲是new Promise()方法的快捷方式,是一種語法糖;Promise.reject(error)與之相似;
b) Promise.resolve方法另外一個做用就是將thenable對象轉換爲promise對象,好比jQuery.ajax()。
5. Promise在規範上規定Promise只能使用異步調用方式 。因此,promise.then其實是屬於異步調用的。
6. Promise方法鏈:Promise能夠將任意個方法連在一塊兒做爲一個方法鏈(method chain)。例如:
.then(taskA).then(taskB).catch(onRejected).then(finalTask);
方法鏈將方法串在一塊兒,按照順序嚴格執行。
* 注意,ECMAScript 3中catch是保留字,所以在IE8一下不能使用,因此,通常使用promise["catch"]或者then來代替之。
圖2. Promise鏈式調用的執行過程
7. 每次調用then都會返回一個新建立的promise對象,應該儘可能避免一個promise執行多個then方法,而是使用鏈式調用法。
8. Promise和數組:Promise.all([…])在全部promise對象都變爲 FulFilled 或 Rejected 狀態以後被調用。Promise對象數組中全部promise方法同時調用。
Promise.race爲任意一個方法變爲 FulFilled 或 Rejected 狀態以後被調用,在第一個promise對象變爲Fulfilled以後,並不會取消其餘promise對象的執行。
9. Promise中的 then 和 catch:
a) 使用promise.then(onFulfilled, onRejected) 的話,在 onFulfilled 中發生異常的話,在 onRejected 中是捕獲不到這個異常的。
b) 在 promise.then(onFulfilled).catch(onRejected) 的狀況下,then 中產生的異常能在 .catch 中捕獲
c) .then 和 .catch 在本質上是沒有區別的,須要分場合使用。
10. Deferred擁有 Promise,Deferred和Promise並非處於競爭的關係,而是Deferred內涵了Promise。使用Deferred,只須要先建立deferred對象,能夠在任什麼時候機對 resolve、reject 方法進行調用。
var deferred = new Deferred();