首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 bluebird 实现更强大的 Promise(2)使用 Promise

使用 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 对象,可以使用其提供的方法来查看其内部状态。
  • isPending 检查 Promise 的状态是否为进行中。
  • isFulfilled 检查 Promise 的状态是否为已满足。
  • isRejected 检查 Promise 的状态是否为已拒绝。
  • isCancelled 检查 Promise 是否被取消。
  • value 获取 Promise 满足后的结果。
  • reason 获取 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();

返回列表