使用 Bluebird 开发异步的 JavaScript 程序(2)
- UID
- 1066743
|
使用 Bluebird 开发异步的 JavaScript 程序(2)
异常处理既然 Promise 只是一个允诺,那么就有失败的可能,在创建 Promise 对象的时候就有一个 reject 函数来表示异常;在 then 函数也有 onRejected handler 的处理。
看清单 10,Promise 的处理包含了 onRejected handler 和 catch 函数,当 then 方法中处理了异常之后,在 catch 中捕获不到异常。
清单 10. Then 的 onRejected 方法和 catch 函数1
2
3
4
5
6
7
8
9
10
11
12
13
| it("Promise with catch handler", function(){
let promise = new Promise(function(resolve, reject){
let returnBody = false;
return returnBody?resolve(true):reject(false);
});
promise.then({},function(data){
expect(data).toBe(false);
}).catch(function(e){
expect(true).toBe(false);
}).finally(function(){
expect(true).toBeTruthy();
});
});
|
Then 函数中的 OnRejected 和 catch 函数的区别有:
- 一旦 then 捕获到了异常,catch 函数中就捕获不到异常。
- catch 函数能捕获到这个 Promise chain 中的异常。then 只能捕获单个 Promise 中的异常。
- finally 函数保证在这个 Promise 链执行之后都会被执行,一般用于关闭在 Promise 中的资源。
资源管理我们知道 finally 函数经常用来关闭资源,但是在 Promise 调用复杂时,尤其是多个调用同时进行(例如使用 Promise.all 进行一组调用的时候)。我们不好识别哪些需要关闭,这时候就能用到 Promise.using 函数了。
Promise.using我们可以用 disposer 函数把一个 Promise 对象转化成 disposer 对象供 Promise.using 调用。在 disposer 中定义资源关闭逻辑,那么在 Promise.using 调用的过程中,会自动执行 disposer 的资源关闭逻辑。如清单 11,会在 then 方法执行前,打印出 resource closed 字样。
清单 11. Promise using 资源管理1
2
3
4
5
6
7
8
9
10
11
12
| it("Promise using function call", function(){
let f = function(){
return Promise.resolve(true).disposer(function(){
console.log("resource closed");
});
};
Promise.using(f(), function(data){
expect(data).toBeTruthy();
}).then(function(){
console.log("resouce cannot be used");
})
});
|
测试函数在原型链执行过程中,如果我们要监测 Promise 的返回状态我们可以使用测试函数。Bluebird 提供的测试函数有以下四种。
- IsFulFilled
- IsRejected
- isPending
- isCancelled
配合使用的获得返回结果和进行错误处理的函数有 value 和 reason。如清单 12。
清单 12. 测试函数样例1
2
3
4
5
6
| if(p.isFulFilled()){
console.log(p.value());
}
if(p.isRejected()){
console.log(p.reason());
}
|
|
|
|
|
|
|