1. 程式人生 > >HTML5 的 JavaScript Promise

HTML5 的 JavaScript Promise

1 Promise

(1)Promise是一種抽象非同步處理的物件,其核心概念為“確保在一件事做完之後,再做另一件事”。

(2)瀏覽器支援:

到目前為止:Safari8、 Chrome 34、Firefox30、Opera20以上版本支援該物件。

2 建立Promise物件

var promise = new Promise(function(resolve,reject){
    //做一些事情,可以說非同步的,然後。。。
    if(/*一切正常*/){
        resolve("一切正常");
    }else{
        reject(Error("處理失敗"));
    }
});

(1)其建構函式種使用一個引數,引數值為一個回撥函式。該回調函式又使用兩個引數,引數值分別為兩個回撥函式。

(2)在Promise建構函式的引數值回撥函式種可以執行一些處理(可以說非同步處理),如果執行結果正常則呼叫resolve回撥函式,否則呼叫reject回撥函式。

(3)在H5中,將執行結果正常稱為Promise物件返回肯定結果,將執行失敗稱為Promise物件返回否定結果。

3 then方法

promise.then(function(result){
    console.log(result);
},function(err){
    console.log(err);
});

(1)該方法採用兩個引數,引數值均為回撥函式,第一個回撥函式用於對Promise建構函式中所指定的引數值回撥函式中的處理執行成功的場合,另一個回撥函式用於失敗的場合。

(2)兩個回撥函式都是可選的。(即可只指定一個)

//只指定成功時的回撥函式
promise.then(function(result){
    console.log(result);
});
//只指定失敗時的回撥函式
promise.then(undefined,function(err){
    console.log(err);
});

(3)鏈式呼叫Promise物件的then方法

可以通過鏈式呼叫Promise物件的then方法來一個接一個地執行附加的非同步操作。

var promise = new Promise(function(resolve,reject){
        resolve(1);
});
promise.then(function(val){
    console.log(val);//1
    return val+2;
}).then(function(val){
    console.log(val);//3
});

4 將非同步操作佇列化

通過鏈式呼叫Promise物件的then方法來一個接一個地執行附加的非同步操作。

(1)當從一個then方法的引數值回撥函式進行返回時,如果返回一個值, 下一個then方法將被立即呼叫,並且使用該返回值作為引數。

(2)如果then方法的引數值回撥函式返回一個Promise物件,下一個then方法將 對其進行等待,直到這個Promise物件的引數值回撥函式中的處理結果確定(肯定或否定)以後才會被呼叫。

//依次讀取檔案
//getData()返回一個Promise物件
getData("1.txt").then(function(){
    return getData("2.txt");
}).then(function(){
    return getData("3.txt");
}).then(function(){
    //執行操作
})

5 異常處理

可以使用catch機制來捕捉Promise建構函式的引數值回撥函式中丟擲的錯誤

promise.then(function(result){
    console.log(result);
}).catch(function(err)){
    console.log(err);
});

(1)此catch機制只是then(undefined,func)的簡明語法,目的是增加程式碼的可讀性。其等同於

promise.then(function(result){
    console.log(result);
}).then(undefined,function(err)){
    console.log(err);
});

(2)Promise物件返回否定結果之後會跳轉到之後第一個配置了否定回撥的then方法(或catch方法,兩者含義相同)。

(3)Promise物件的否定回撥函式可以通過Promise.reject()方法顯示呼叫,但也可以被Promise物件的建構函式的引數值回撥函式中丟擲的錯誤隱式呼叫。(catch機制:錯誤被自動捕捉並轉化為否定結果)

(4)在Promise物件的then方法的引數值回撥函式種丟擲的錯誤也是(catch機制)。

6 Promise物件序列

  • Promise類的靜態方法-resolve()

該方法最多一個引數

(1)引數值為Promise物件時,resolve方法根據傳入的Promise物件複製一個新的Promise物件。

(2)引數值為其他任何值,建立一個以這個值為肯定結果(即傳遞給Promise建構函式的引數值回撥函式中的resolve回撥函式的引數)的Promise物件。

(3)不指定引數值,建立一個以“undefined”為肯定結果的Promise物件。

  • Promise類的靜態方法-reject()

同上,改為否定結果即可。

Promise.resolve().then(function(){
        return getSequence;
}).then(function(){
    //
}).catch(function(){
   //
});

(建立一個可以返回肯定或否定結果的Promise物件,從而立即呼叫回撥函式)

7 執行並行處理

Promise類的all方法

Promise.all(arrayOfPromises).then(function(arrayOfResults)){
        //返回結果都為肯定結果
});

(1)功能:並行執行多個非同步處理。

(2)此方法以一個Promise物件陣列作為引數,並建立一個當所有執行結果都已成功時返回肯定結果的Promise物件。

(3)在該物件的then方法中可以得到一個結果陣列,該結果陣列與傳入的Promise物件陣列的順序保持一致。

(4)如果任一Promise物件返回否定結果則呼叫reject回撥函式。

(5)Promise.race()方法

同樣以一個Promise物件陣列作為引數,但是當陣列中任何元素返回肯定結果時,該方法立即返回肯定結果,或則當任何元素返回否定結果時立即返回否定結果(返回第一個肯定或否定結果)。