1. 程式人生 > >異步編程之Javascript Promises 規範介紹

異步編程之Javascript Promises 規範介紹

async ogr RR catch 處理對象 rda 關系 解決 發生

什麽是?Promises

Promises是一種關於異步編程的規範。目的是將異步處理對象和處理規則進行規範化。為異步編程提供統一接口。

?

傳統的回調函數

說到JavaScript的異步編程處理,通常我們會想到回調函數,如以下的代碼:

getFileAsync("1.txt", function(error, result){

     if(error){

         throw error;

     }

    // 取得成功時的處理

});

  

上面的代碼定義了一個獲取文件內容的函數,讀取完畢後回調用傳入的回調函數。對於以下的場景:

? ? ? - 讀取文件 1.txt 的內容。其內容也是一個文件地址。我們稱為 2.txt

? ? ? - 讀取文件 2.txt 的內容。其內容還是一個文件地址。我們稱為 3.txt

? ? ? - 讀取文件 3.txt 的內容

?

使用回調函數的代碼例如以下:

?

getFileAsync(“1.txt", function(error1, result1){

     if(error1){

          throw error1;

     }

     getFileAsync(result1, function(error2, result2){    

          if(error1){

               throw error1;

          }

          getFileAsync(result2, function(error3, result3){

               console.log(result3);

          });

     });

});

?

  

這就是所謂的回調金字塔。回調函數嵌套非常深。代碼非常不好看。也不easy閱讀。而Promise正是碾平異步回調的解決方式。?

?

Promises?規範

Promises/A(http://wiki.commonjs.org/wiki/Promises/A)是由CommonJS組織制定的異步模式編程規範,提供了一個在程序中描寫敘述延時(或將來)概念的解決方式。基本的思想是運行一個異步方法的時候。不堵塞應用程序。返回一個Promise對象。

?

Promises/A+(https://promisesaplus.com/)規範是對Promises/A規範的補充和改動。

?

Promise對象有三種狀態:初始狀態(pending)、成功(fulfilled)和失敗(rejected),當中pending為初始狀態,fulfilled和rejected為結束狀態。狀態轉換關系為:pending->fulfilled,pending->rejected。?promise對象從Pending

轉換為FulfilledRejected之後。 這個promise對象的狀態就不會再發生不論什麽變化。例如以下圖:

?技術分享圖片

?

Promise是一個擁有 then 方法的對象,then接口用於監聽一個Promise的不同狀態。

?

then(fulfilledHandler, errorHandler, progressHandler)。

加入fulfilledHandler、errorHandler和progressHandler後,promise對象就構成了。

fulfilledHandler是在promise被裝載數據的時候調用。errorHandler在promise失敗的時候調用,progressHandler則在progress事件觸發的時候調用。

?

var promise = getAsyncPromise("fileA.txt");

promise.then(function(result){

     // 獲取文件內容成功時的處理

}, function(error){

     // 獲取文件內容失敗時的處理

}); 

  


Promises?鏈式調用
?

then方法在fulfilledHandler或者errorHandler回調完畢之後,會返回一個新的promise對象。而不是原來的Promise對象,這樣一來。promise操作就行形成鏈式調用。

?

var promise = new Promise(function (resolve) {

    resolve(100);

});

  

promise.then(function(value) {

     return value *2;

}).then(function(value) {

     return value *2;

}).then(function(value) {

     console.log(value); // => 100 * 2 * 2

}); 

?

  

Promises?錯誤處理?

then()函數接收兩個回調函數作為參數。

第二個回調函數在Promise變為rejected時被觸發的函數。

Promise還提供了一個catch()函數來處理Promise的rejected狀態。

看以下的代碼:

promise.then(fucntion(result){

    console.log(‘Got data!‘,relust);

}).catch(function(error){

    console.log(‘Error occurred!‘,error);

});

  

?上面的代碼事實上等價於:

promise.then(function(result){

    console.log(‘Got data‘,result);

},function(error){

    console.log(‘Error occurred!‘,error);

}); 

  


瀏覽器支持:
?

Promises 如今已經是JavaScript標準的一部分了, 差點兒所有的瀏覽器已經實現了Promises API。瀏覽器兼容性例如以下:

?技術分享圖片

?

本文簡要的介紹了Promises的基礎知識,希望我們我們可以更好的使用Promises,更輕松的編寫代碼。

異步編程之Javascript Promises 規範介紹