[TOC]
## 寫作初衷
本書的目的是以目前還在制定中的[ECMAScript 6 Promises](http://liubin.github.io/promises-book/#es6-promises)規范為中心,著重向各位讀者介紹JavaScript中對Promise相關技術的支持情況。
通過閱讀本書,我們希望各位讀者能在下面三個目標上有所收獲。
* 學習Promise相關內容,能熟練使用Promise模式并進行測試
* 學習Promise適合什么、不適合什么,知道Promise不是萬能的,不能什么都想用Promise來解決
* 以ES6 Promises為基礎進行學習,逐漸發展形成自己的風格
像上面所提到的那樣,本書主要是以[ES6 Promises](http://liubin.github.io/promises-book/#es6-promises),即JavaScript的標準規范為基礎的、Promise的相關知識為主要講解內容。
在Firefox和Chrome這樣技術比較超前的瀏覽器上,不需要安裝額外的插件就能使用Promise功能,此外ES6 Promises的規范來源于[Promises/A+](http://liubin.github.io/promises-book/#promises-aplus)社區,它有很多版本的實現。
我們將會從基礎API開始介紹可以在瀏覽器的原生支持或者通過插件支持的Promise功能。 也希望各位讀者能了解這其中Promise適合干什么,不適合干什么,能根據實際需求選擇合適的技術實現方案。
## 開始閱讀之前
本書的閱讀對象需要對JavaScript有基本的了解和知識。
* [JavaScript: The Good Parts](http://shop.oreilly.com/product/9780596517748.do)
* [JavaScript Patterns](http://shop.oreilly.com/product/9780596806767.do)
* [JavaScript: The Definitive Guide, 6th Edition](http://shop.oreilly.com/product/9780596805531.do)
* [Perfect JavaScript(日文版)](http://gihyo.jp/book/2011/978-4-7741-4813-7?ard=1400715177)
* [Effective JavaScript(日文版)](http://books.shoeisha.co.jp/book/b107881.html)
如果你讀過上面的其中一本的話,就應該非常容易理解本書的內容了。
另外如果你有使用JavaScript編寫Web應用程序的經驗,或者使用Node.js編寫過命令行、服務器端程序的話,那么你可能會對本文中的一些內容感到非常熟悉。
本書的一本分章節將會以Node.js環境為背景進行說明,如果你有Node.js基礎的話,那么一定會非常容易理解這部分內容了。
## 格式約定
本書為了節約篇幅,用了下面一些格式上的約定。
* 關于Promise的術語請參考[術語集](http://liubin.github.io/promises-book/#promise-glossary)。
* 一般一個名詞第一次出現時都會附帶相關鏈接。
* 實例方法都用 instance#method 的形式。
* 比如?`Promise#then`?這種寫法表示的是 Promise的實例對象的?`then`?這一方法。
* 對象方法都采用 object.method 的形式。
* 這沿用了JavaScript中的使用方式,`Promise.all`?表示的是一個靜態方法。
> 這部分內容主要講述的是對正文部分的補充說明。
## 推薦瀏覽器
我們推薦使用內置對Promise支持的瀏覽器來閱讀本書。
Firefox和Chrome的話都支持[ES6 Promises](http://liubin.github.io/promises-book/#es6-promises)標準。
此外,雖然不是推薦的閱讀環境,但是讀者還是能在iOS等移動終端上閱讀本書。
## 運行示例代碼
本網站使用了Promise的[Polyfill類庫](http://liubin.github.io/promises-book/#promise-polyfill),因此即使在不支持Promise的瀏覽器上也能執行示例代碼。
此外像下面這樣,各位讀者可以通過運行按鈕來運行可執行的示例代碼。
~~~
var promise = new Promise(function(resolve){
resolve(42);
});
promise.then(function(value){
console.log(value);
}).catch(function(error){
console.error(error);
});
~~~
按下?運行?按鈕之后,代碼區會變成編輯區,代碼也會被執行。當然你也可以通過這個按鈕再次運行代碼。
清除log?按鈕用于清除由?`console.log`?打印出來的log。?
退出按鈕用來退出編輯模式。
如果你對哪里有疑問的話,都可以現場修改代碼并執行,以加深對該部分代碼的理解。
## 本書源代碼/License
本書中示例代碼都可以在GitHub上找到。
本書采用?[AsciiDoc](http://asciidoctor.org/)?格式編寫。
* [azu/promises-book](https://github.com/azu/promises-book)?[](https://travis-ci.org/azu/promises-book)
此外代碼倉庫中還包含本書示例代碼的測試代碼。
源代碼的許可證為MIT許可證,文章內容可以基于CC-BY-NC使用。
## 意見和疑問
如果有意見或者問題的話,可以直接在GitHub上提Issue即可。
* [Issues · azu/promises-book 日文版](https://github.com/azu/promises-book/issues?state=open)
* [Issues · liubin/promises-book 中文版](https://github.com/liubin/promises-book/issues?state=open)
此外,你也可以在?[在線聊天](https://gitter.im/azu/promises-book)?上留言。
* [](https://gitter.im/azu/promises-book)
各位讀者除了能免費閱讀本書,也有編輯本書的權利。你可以在GitHub上通過?[Pull Requests](https://github.com/azu/promises-book/pulls)?來貢獻自己的工作。
- 前言
- 第一章 - 什么是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
- 第六章 - 用語集
- 第七章 - 參考網站
- 第八章 - 關于作者
- 第九章 - 關于譯者