您的位置:首页 > 理论基础 > 计算机网络

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

2016-04-17 11:39 323 查看
 

实例方法都用 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. 总结

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

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

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

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

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

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

需要分场合使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: