好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JavascriptPromise学习笔记-小qqchen

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的详细内容...

  阅读:31次