Board logo

标题: 使用 bluebird 实现更强大的 Promise(2)使用 Promise [打印本页]

作者: look_w    时间: 2018-11-22 18:28     标题: 使用 bluebird 实现更强大的 Promise(2)使用 Promise

使用 Promise在之前的代码示例中,我们已经看到了 Promise 对象的基本用法。其中 then 方法用来添加处理 Promise                结果的回调方法。可以同时添加已满足状态和已拒绝状态的回调方法。spread 方法的作用与 then 相似。当 Promise                的结果值为数组时,可以使用 spread 方法把数组的元素打平(flatten)为回调方法的不同参数。在代码清单4中,Promise                的值是一个包含3个值的数组,分别对应处理方法的3个参数。
清单4. spread                使用示例
1
2
Promise.resolve([1, 2, 3])
.spread((v1, v2, v3) => console.log(v1 + v2 + v3));




catch 方法用来添加已拒绝状态时的回调方法。catch                方法有两种使用方式。第一种方式只添加回调方法,会捕获所有错误情况;第二种方式是使用错误对象类型或断言(predicate)来对错误进行过滤。error                方法的作用与 catch 类似,但是 error 只会处理真正的 Error 对象。JavaScript 中的 throw                语句是可以抛出任何值的,不一定是 Error 对象。throw 抛出的任何值都会被 catch 处理,但是只有 Error 对象才会被 error                    处理。在代码清单5中,error 添加的处理方法并不会被调用。
清单5. error                使用示例
1
2
Promise.reject('not an Error')
.error(err => console.log('should not appear'));




finally 方法添加的回调方法不管 Promise 的最终状态如何,都会被调用。 中的 catch 只会捕获 TypeError,而 finally 中的逻辑始终会被调用。
清单6.                catch 和 finally 使用示例
1
2
3
Promise.reject(new TypeError('some error'))
  .catch(TypeError, console.error)
  .finally(() => console.log('done'));




对于一个 Promise 对象,可以使用其提供的方法来查看其内部状态。
可以使用 cancel 方法来取消一个 Promise,表示不再对 Promise 的结果感兴趣。当一个 Promise                被取消之后,其回调方法都不会被调用。取消功能默认是禁用的,需要使用 Promise.config 来启用该功能。需要注意的是,取消 Promise                只是表示 Promise 的回调方法不被调用,并不会自动取消正在进行的异步操作,比如不会自动终止进行中的 XHR                    请求。如果需要添加自定义的取消逻辑,代码清单3中的 Promise                构造方法的唯一参数所对应的方法可以添加第三个参数 onCancel,用来注册 Promise 取消时的回调方法。
清单7. 使用                Promise 的取消功能
1
2
3
4
5
Promise.config({
cancellation: true,
});

Promise.delay(1000, 'hello').then(console.log).cancel();






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0