使用 bluebird 实现更强大的 Promise(5)实用方法
- UID
- 1066743
|
使用 bluebird 实现更强大的 Promise(5)实用方法
实用方法Promise 中还包含了一些实用方法。tap 和 tapCatch 分别用来查看 Promise 中的结果和出现的错误。这两个方法中的处理方法不会影响 Promise 的结果,适合用来执行日志记录。call 用来调用 Promise 结果对象中的方法。get 用来获取 Promise 结果对象中的属性值。return 用来改变 Promise 的结果。throw 用来抛出错误。catchReturn 用来在捕获错误之后,改变 Promise 的值。catchThrow 用来在捕获错误之后,抛出新的错误。
代码清单15给出了这些实用方法的使用示例。第一个语句使用 tap 来输出 Promise 的结果。第二个语句使用 call 来调用 sayHi 方法,并把该方法的返回值作为 Promise 的结果。第三个语句使用 get 来获取属性b的值,并作为 Promise 的结果。第四个语句使用 return 来改变了 Promise 的结果。第五个语句使用 throw 来抛出错误,再用 catch 来处理错误。第六个语句使用 catchReturn 来处理错误并改变 Promise 的值。
清单15. 实用方法的使用示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| Promise.resolve(1)
.tap(console.log)
.then(v => v + 1)
.then(console.log);
Promise.resolve({
sayHi: () => 'hi',
}).call('sayHi').then(console.log);
Promise.resolve({
a: 'hello',
b: 1,
}).get('b').then(console.log);
Promise.resolve(1)
.return(2)
.then(console.log);
Promise.resolve(1)
.throw(new TypeError('type error'))
.catch(console.error);
Promise.reject(new TypeError('type error'))
.catchReturn('default value')
.then(console.log);
|
错误处理虽然可以使用 Promise 的 catch 来捕获错误并进行处理,在很多情况下,由于程序本身或第三方库的问题,仍然可能出现错误没有被捕获的情况。未捕获的错误可能导致 NodeJS 进程意外退出。Bluebird 提供了全局和本地两种错误处理机制。Bluebird 会触发与 Promise 被拒绝相关的全局事件,分别是 unhandledRejection 和 rejectionHandled。可以添加全局的事件处理器来处理这两种事件。对于每个 Promise,可以使用 onPossiblyUnhandledRejection 方法来添加对于未处理的拒绝错误的默认处理方法。如果不关注未处理的错误,可以使用 suppressUnhandledRejections 来忽略错误。
在代码清单16中,Promise 的拒绝错误未被处理,由全局的处理器来进行处理。
清单16. 错误处理示例1
2
3
4
| Promise.reject(new TypeError('error'))
.then(console.log);
process.on('unhandledRejection', (reason, promise) => console.error(`unhandled ${reason}
|
|
|
|
|
|
|