1. 程式人生 > >ES6學習筆記五:Promise異步任務

ES6學習筆記五:Promise異步任務

任務 ted 構造函數 才會 數組 接受 異步操作 異步任務 進行

一:Promise對象

Promise對象代表一個異步操作,有三種狀態:Pending(進行中)、Resolved(已完成,又稱 Fulfilled)和Rejected(已失敗)。

二:創建與使用

var promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

Promise構造函數接受一個函數作為參數,該函數的兩個參數分別是resolvereject。它們是兩個函數,由 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的狀態由p1p2p3決定,分成兩種情況。

(1)只有p1p2p3的狀態都變成fulfilledp的狀態才會變成fulfilled,此時p1p2p3的返回值組成一個數組,傳遞給p的回調函數。

(2)只要p1p2p3

之中有一個被rejectedp的狀態就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。

四:跟蹤多個異步操作

romise.race方法同樣是將多個Promise實例,包裝成一個新的Promise實例。

var p = Promise.race([p1, p2, p3]);

只要p1p2p3之中有一個實例率先改變狀態,p的狀態就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數。

ES6學習筆記五:Promise異步任務