ES6學習筆記五:Promise異步任務
一:Promise對象
Promise
對象代表一個異步操作,有三種狀態:Pending
(進行中)、Resolved
(已完成,又稱 Fulfilled)和Rejected
(已失敗)。
二:創建與使用
var promise = new Promise(function(resolve, reject) { // ... some code if (/* 異步操作成功 */){ resolve(value); } else { reject(error); } });
Promise
構造函數接受一個函數作為參數,該函數的兩個參數分別是resolve
和reject
。它們是兩個函數,由 JavaScript 引擎提供,不用自己寫。
resolve
函數的作用是,將Promise
對象的狀態從“未完成”變為“成功”(即從 Pending 變為 Resolved),在異步操作成功時調用,並將異步操作的結果,作為參數傳遞出去;
reject
函數的作用是,將Promise
對象的狀態從“未完成”變為“失敗”(即從 Pending 變為 Rejected),在異步操作失敗時調用,並將異步操作報出的錯誤,作為參數傳遞出去。
Promise 新建後就會立即執行,執行結果與回調函數如下:
promise.then(function(value) { // success to do }, function(error) { // failure to do});
then
方法的兩個參數:第一個回調函數是Promise
對象的狀態變為Resolved
時調用,第二個回調函數是Promise
對象的狀態變為Rejected
時調用。
三:整合多個異步操作
Promise.all
方法用於將多個 Promise 實例,包裝成一個新的 Promise 實例。
var p = Promise.all([p1, p2, p3]);
p
的狀態由p1
、p2
、p3
決定,分成兩種情況。
(1)只有p1
、p2
、p3
的狀態都變成fulfilled
,p
的狀態才會變成fulfilled
,此時p1
、p2
、p3
的返回值組成一個數組,傳遞給p
的回調函數。
(2)只要p1
、p2
、p3
rejected
,p
的狀態就變成rejected
,此時第一個被reject
的實例的返回值,會傳遞給p
的回調函數。
四:跟蹤多個異步操作
romise.race
方法同樣是將多個Promise實例,包裝成一個新的Promise實例。
var p = Promise.race([p1, p2, p3]);
只要p1
、p2
、p3
之中有一個實例率先改變狀態,p
的狀態就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給p
的回調函數。
ES6學習筆記五:Promise異步任務