http://liubin.org/promises-book/

来源:互联网 发布:淘宝借贷平台 编辑:程序博客网 时间:2024/06/04 23:56

  •  
    • 实例方法都用 instance#method 的形式。

      • 比如 Promise#then 这种写法表示的是 Promise的实例对象的 then 这一方法。

    • 对象方法都采用 object.method 的形式。

      • 这沿用了JavaScript中的使用方式,Promise.all 表示的是一个静态方法。

  • 1. Chapter.1 - 什么是Promise

  • 个人感觉Promise相当于设计模式中的模板模式。
  • Promise模式对需要回调函数作为参数的函数进行包装。将原函数放入Promise对象,将原函数需要的回调函数放置到Promise.then().catch(). 通过创建Promise对象时,传递的回调函数的参数resolve, reject参数进行映射。resolve对应then(), reject对应catch()

2. Chapter.2 - 实战Promise

静态方法Promise.resolve(value) 可以认为是 new Promise() 方法的快捷方式。


Promise.resolve 方法另一个作用就是将 thenable 对象转换为promise对象。

就像我们有时称具有 .length 方法的非数组对象为Array like一样,thenable指的是一个具有 .then 方法的对象
除了在编写使用Promise的类库等软件时需要对Thenable有所了解之外,通常作为end-user使用的时候,我们可能不会用到此功能。

Promise.reject(error)是和 Promise.resolve(value) 类似的静态方法,是 new Promise() 方法的快捷方式。

2.3. 专栏: Promise只能进行异步操作?

这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用。
mixed-onready.js会根据执行时DOM是否已经装载完毕来决定是对回调函数进行同步调用还是异步调用。

 Effective JavaScript 的 第67项 不要对异步回调函数进行同步调用 中也有详细介绍。

前面我们看到的 promise.then 也属于此类,为了避免上述中同时使用同步、异步调用可能引起的混乱问题,Promise在规范上规定Promise只能使用异步调用方式 。

2.4. Promise#then

这其中,我想大家已经认识了 .then().catch() 这种链式方法的写法了,其实在Promise里可以将任意个方法连在一起作为一个方法链(method chain)。


2.4.2. promise chain 中如何传递参数

那就是在 Task A 中 return 的返回值,会在 Task B 执行时传给它。

2.5. Promise#catch

很多压缩工具自带了将 promise.catch 转换为 promise["catch"] 的功能

2.6. 专栏: 每次调用then都会返回一个新创建的promise对象

然而实际上不管是 then 还是 catch 方法调用,都返回了一个新的promise对象。
没有使用promise的方法链方式,这在Promise中是应该极力避免的写法。

2.10. then or catch?

.then 方法中的onRejected参数所指定的回调函数,实际上针对的是其promise对象或者之前的promise对象,而不是针对 .then 方法里面指定的第一个参数,即onFulfilled所指向的对象,这也是 then 和 catch 表现不同的原因。

由于 .catch 方法是 .then 的别名,我们使用 .then 也能完成同样的工作。只不过使用 .catch 的话意图更明确,更容易理解。

2.10.2. 总结

这里我们又学习到了如下一些内容。

  1. 使用promise.then(onFulfilled, onRejected) 的话

    • 在 onFulfilled 中发生异常的话,在 onRejected 中是捕获不到这个异常的。

  2. 在 promise.then(onFulfilled).catch(onRejected) 的情况下

    • then 中产生的异常能在 .catch 中捕获

  3. .then 和 .catch 在本质上是没有区别的

    • 需要分场合使用。


0 0
原创粉丝点击