1. 定义:Promise是抽象异步处理对象以及对其进行各类操做的组件,它把异步处理对象和异步处理规则采用统一的接口进行规范化。ajax
2. ES6 Promises 标准中定义的API:数组
a) Constructor:采用new来实例化,
var promise = new Promise(function(resolve, reject) {…});promise
b) Instance Method:使用then方法设置成功(resolve)和失败(reject)时的回调函数, 异步
promise.then(onFulfilled, onRejected),ide
promise.catch(onRejected),其中,catch只是then的别名而已;函数
c) Static Method:一些其余的辅助方法,好比all(),resolve()。spa
3. Promise 状态。三种状态:Pending(初始化)、Fulfilled和Rejected。在then后执行的函数能够确定地说只会被调用一次。3d
promise对象被 resolve 时的处理 onFulfilledorm
promise对象被 reject 时的处理 onRejected 对象
图1. Promise调用的执行过程
4. Resolve方法:
a) 静态方法Promise.resolve(value)能够认为是new Promise()方法的快捷方式,是一种语法糖;Promise.reject(error)与之相似;
b) Promise.resolve方法另外一个做用就是将thenable对象转换为promise对象,好比jQuery.ajax()。
5. Promise在规范上规定Promise只能使用异步调用方式 。因此,promise.then其实是属于异步调用的。
6. Promise方法链:Promise能够将任意个方法连在一块儿做为一个方法链(method chain)。例如:
.then(taskA).then(taskB).catch(onRejected).then(finalTask);
方法链将方法串在一块儿,按照顺序严格执行。
* 注意,ECMAScript 3中catch是保留字,所以在IE8一下不能使用,因此,通常使用promise["catch"]或者then来代替之。
图2. Promise链式调用的执行过程
7. 每次调用then都会返回一个新建立的promise对象,应该尽可能避免一个promise执行多个then方法,而是使用链式调用法。
8. Promise和数组:Promise.all([…])在全部promise对象都变为 FulFilled 或 Rejected 状态以后被调用。Promise对象数组中全部promise方法同时调用。
Promise.race为任意一个方法变为 FulFilled 或 Rejected 状态以后被调用,在第一个promise对象变为Fulfilled以后,并不会取消其余promise对象的执行。
9. Promise中的 then 和 catch:
a) 使用promise.then(onFulfilled, onRejected) 的话,在 onFulfilled 中发生异常的话,在 onRejected 中是捕获不到这个异常的。
b) 在 promise.then(onFulfilled).catch(onRejected) 的状况下,then 中产生的异常能在 .catch 中捕获
c) .then 和 .catch 在本质上是没有区别的,须要分场合使用。
10. Deferred拥有 Promise,Deferred和Promise并非处于竞争的关系,而是Deferred内涵了Promise。使用Deferred,只须要先建立deferred对象,能够在任什么时候机对 resolve、reject 方法进行调用。
var deferred = new Deferred();