1. 定义: Promise 是抽象 异步处理对象 以及对其进行各种操作的 组件 ,它把 异步处理对象 和 异步处理规则 采用 统一的接口 进行 规范化。
2. ES6 Promises 标准中定义的 API :
a) Constructor :采用 new 来实例化,
var promise = new Promise(function(resolve, reject) {…});
b) Instance Method :使用 then 方法设置 成功 (resolve) 和 失败 (reject) 时的回调函数,
promise.then(onFulfilled, onRejected) ,
promise.catch(onRejected) , 其中, catch 只是 then 的别名而已;
c) Static Method :一些其他的辅助方法,比如 all() , resolve() 。
3. Promise 状态。三种状态: Pending( 初始化 ) 、 Fulfilled 和 Rejected 。在 then 后执行的函数可以肯定地说只会被调用一次。
promise 对象被 resolve 时的处理 onFulfilled
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();
本文摘自 JavaScript Promise迷你书(中文版)
查看更多关于JavascriptPromise学习笔记-小qqchen的详细内容...