[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) [![Build Status](https://travis-ci.org/azu/promises-book.svg?branch=master)](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) 上留言。
* [![Gitter](https://badges.gitter.im/azu/promises-book.png)](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
- 第六章 - 用語集
- 第七章 - 参考网站
- 第八章 - 关于作者
- 第九章 - 关于译者