異步編程之Javascript Promises 規範介紹
什麽是?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
?
?
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 規範介紹