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物件陣列作為引數,但是當陣列中任何元素返回肯定結果時,該方法立即返回肯定結果,或則當任何元素返回否定結果時立即返回否定結果(返回第一個肯定或否定結果)。