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在本质上是没有区别的
需要分场合使用。
相关文章推荐
- XCODE7以后不能使用HTTP协议解决办法
- XCODE7以后不能使用HTTP协议解决办法
- 遗传网络算法
- TCP为什么是三次握手,而不是两次
- 神经网络 neural network
- nefu500网购【二分+网络流】
- 贝叶斯网络的BDe BIC评分
- http2.0 相对于 http1.1的优势
- ARPspoofing
- 人工神经网络基本特点
- linux下select使用--转载http://www.cnblogs.com/moonvan/archive/2012/05/26/2518881.html
- 《原创》网络版五子棋node.js+websocket
- 计算机网络中的TCP/UDP协议到底是怎么回事(一)
- 记录两个免费HTTPS服务商
- DefaultHttpClient is deprecated
- Http Response Code
- 简单形象又有趣地说说强大的神经网络
- ASIHTTPRequest的使用——库文件的导入与设置
- CC2530低功耗终端不停重连网络耗电问题
- # 1089 最短路径·二:Floyd算法 hihocoder http://ideone.com/R8ixAH