Promise: 許諾
用來創建promise對象的構造函數: function Promise (excutor) {}
簡潔描述: 一個promise對象用來表示一個異步操作的最終狀態(完成或失敗),以及該異步操作的結果值
詳細描述: Promise 對象是一個代理對象(代理一個值),被代理的值在Promise對象創建時是未知的。
它允許你為異步操作的成功和失敗分別綁定相應的處理回調函數
這讓異步方法可以像同步方法那樣返回值,但并不是立即返回最終執行結果,而是一個能代表未來出現的結果的promise對象
promise對象的3種狀態值
pending(未決定的): 初始狀態,既不是成功,也不是失敗狀態。
resolved/fulfilled(完成的): 意味著操作成功完成。
rejected(拒絕的): 意味著操作失敗。
promise對象的狀態變化(2種)
pending ==> resolved: 調用resolve()
pending ==> rejected: 調用reject()
注意: promise的狀態確定后就不可再轉換為其它狀態
promise對象內部隱藏的屬性
[[PromiseStatus]]: 內部變量, 存儲promise對象當前的狀態值
[[PromiseValue]]: 內部變量, 存儲成功后的value或失敗后的reason
2). excutor: 執行器
executor是帶有 resolve 和 reject 兩個參數的函數: (resolve, reject) => {}
由我們定義, 在new Promise()內部會立即同步調用 executor 函數(不是我們調用的)
異步操作的代碼應該在此函數中執行, 一般成功后調用resolve(), 失敗后調用reject()
3). resolve: 解決
由Promise函數內部定義, 但由我們調用的函數
當異步任務成功時, 我們應該調用resolve函數, 并傳入需要的value
resolve函數內部:
同步修改promise對象的狀態為resolved和保存成功value,
異步執行已經存儲的所有onFulfilled回調函數
4). reject: 拒絕
由Promise函數內部定義, 但由我們調用的函數
當異步任務失敗/拋出error時, 我們應該調用reject函數, 并傳入需要的reason
reject函數內部:
同步修改promise對象的狀態為rejected和保存失敗reason
異步調用已經存儲的所有onRejected回調函數
5). then: 接著
promise對象的方法: then(onRsolved函數, onRejected函數), 返回值為一個新的promise對象
作用: 用來指定promise的狀態為resolved或rejected時的回調函數
注意:
then()方法的返回值為新的promise對象, 這樣可以進行.then()的鏈式調用
返回的promise的結果狀態和值由回調函數的結果決定
6). onResolved: 當已解決時
由then()的第一個參數指定的回調函數: (value) => {}
當promise的狀態為resolved時自動異步調用
onResolved函數的返回值:
新的promise對象
其它或不返回
7). onRejected: 當已拒絕時
由then()的第二個參數或catch()指定的回調函數: (reason) => {}
當promise的狀態為rejected時自動異步調用
onRejected函數的返回值:
新的promise對象
其它或不返回
8). catch: 捕獲
promise對象的方法: catch(onRejected函數)
是then()的語法糖方法, 相當于: then(null, onRejected函數)
9). Promise.resolve()
手動創建一個已經resolve的promise的快捷方法: Promise.resolve(value/promise)
如果參數為promise: 讀取此promise結果值作為返回promise的結果值
10). Promise.reject() 用得很少
手動創建一個已經reject的promise的快捷方法: Promise.reject(reason)
11). Promise.all([p1, p2, p3])
用來實現批量執行多個promise的異步操作, 返回一個新的promise: Promise.all([promise1, promise2, ...])
只有當所有異步操作都resolved后, 返回的promise才會變為resolved狀態, 只要有一個變為rejected, 返回的promise直接變為rejected
面試題: 實現一次發多個請求, 只有都成功后才去做處理?