首先讓我們來了解一下到底什么是Promise。
> Promise是抽象異步處理對象以及對其進行各種操作的組件。 其詳細內容在接下來我們還會進行介紹,Promise并不是從JavaScript中發祥的概念。
Promise最初被提出是在?[E語言](http://erights.org/elib/distrib/pipeline.html)中, 它是基于并列/并行處理設計的一種編程語言。
現在JavaScript也擁有了這種特性,這就是本書所介紹的JavaScript Promise。
另外,如果說到基于JavaScript的異步處理,我想大多數都會想到利用回調函數。
使用了回調函數的異步處理
~~~
getAsync("fileA.txt", function(error, result){ // 傳給回調函數的參數為(error對象, 執行結果)組合
if(error){// 取得失敗時的處理
throw error;
}
// 取得成功時的處理
});
~~~
Node.js等則規定在JavaScript的回調函數的第一個參數為?`Error`?對象,這也是它的一個慣例。
像上面這樣基于回調函數的異步處理如果統一參數使用規則的話,寫法也會很明了。 但是,這也僅是編碼規約而已,即使采用不同的寫法也不會出錯。
而Promise則是把類似的異步處理對象和處理規則進行規范化, 并按照采用統一的接口來編寫,而采取規定方法之外的寫法都會出錯。
下面是使用了Promise進行異步處理的一個例子:
~~~
var promise = getAsyncPromise("fileA.txt"); // 返回promise對象
promise.then(function(result){
// 獲取文件內容成功時的處理
}).catch(function(error){
// 獲取文件內容失敗時的處理
});
~~~
我們可以向這個預設了抽象化異步處理的promise對象, 注冊這個promise對象執行成功時和失敗時相應的回調函數。
這和回調函數方式相比有哪些不同之處呢? 在使用promise進行一步處理的時候,我們必須按照接口規定的方法編寫處理代碼。
也就是說,除promise對象規定的方法(這里的?`then`?或?`catch`)以外的方法都是不可以使用的, 而不會像回調函數方式那樣可以自己自由的定義回調函數的參數,而必須嚴格遵守固定、統一的編程方式來編寫代碼。
這樣,基于Promise的統一接口的做法, 就可以形成基于接口的各種各樣的異步處理模式。
所以,promise的功能是可以將復雜的異步處理輕松地進行模式化, 這也可以說得上是使用promise的理由之一。
接下來,讓我們在實踐中來學習JavaScript的Promise吧。
- 前言
- 第一章 - 什么是Promise
- 1.1. 什么是Promise
- 1.2. Promise簡介
- 1.3. 編寫Promise代碼
- 第二章 - 實戰Promise
- 2.1. Promise.resolve
- 2.2. Promise.reject
- 2.3. 專欄: Promise只能進行異步操作?
- 2.4. Promise#then
- 2.5. Promise#catch
- 2.6. 專欄: 每次調用then都會返回一個新創建的promise對象
- 2.7. Promise和數組
- 2.8. Promise.all
- 2.9. Promise.race
- 2.10. then or catch?
- 第三章 - Promise測試
- 3.1. 基本測試
- 3.2. Mocha對Promise的支持
- 3.3. 編寫可控測試(controllable tests)
- 第四章 - Advanced
- 4.1. Promise的實現類庫(Library)
- 4.2. Promise.resolve和Thenable
- 4.3. 使用reject而不是throw
- 4.4. Deferred和Promise
- 4.5. 使用Promise.race和delay取消XHR請求
- 4.6. 什么是 Promise.prototype.done ?
- 4.7. Promise和方法鏈(method chain)
- 4.8. 使用Promise進行順序(sequence)處理
- 第五章 - Promises API Reference
- 5.1. Promise#then
- 5.2. Promise#catch
- 5.3. Promise.resolve
- 5.4. Promise.reject
- 5.5. Promise.all
- 5.6. Promise.race
- 第六章 - 用語集
- 第七章 - 參考網站
- 第八章 - 關于作者
- 第九章 - 關于譯者