使用 bluebird 实现更强大的 Promise(2)使用 Promise
- UID
- 1066743
|
使用 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();
|
|
|
|
|
|
|