1. 定義:Promise是抽象非同步處理對象以及對其進行各種操作的組件,它把非同步處理對象和非同步處理規則採用統一的介面進行規範化。 2. ES6 Promises 標準中定義的API: a) Constructor:採用new來實例化, var promise = new Promise(functi... ...
1. 定義:Promise是抽象非同步處理對象以及對其進行各種操作的組件,它把非同步處理對象和非同步處理規則採用統一的介面進行規範化。
2. ES6 Promises 標準中定義的API:
a) Constructor:採用new來實例化,
var promise = new Promise(function(resolve, reject) {…});
b) Instance Method:使用then方法設置成功(resolve)和失敗(reject)時的回調函數,
promise.then(onFulfilled, onRejected),
promise.catch(onRejected),其中,catch只是then的別名而已;
c) Static Method:一些其他的輔助方法,比如all(),resolve()。
3. Promise 狀態。三種狀態:Pending(初始化)、Fulfilled和Rejected。在then後執行的函數可以肯定地說只會被調用一次。
promise對象被 resolve 時的處理 onFulfilled
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();
本文摘自JavaScript Promise迷你書(中文版)