Board logo

标题: 使用 Bluebird 开发异步的 JavaScript 程序(2) [打印本页]

作者: look_w    时间: 2018-11-22 19:10     标题: 使用 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 函数的区别有:
资源管理我们知道 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 提供的测试函数有以下四种。
配合使用的获得返回结果和进行错误处理的函数有 value 和 reason。如清单 12。
清单 12.                测试函数样例
1
2
3
4
5
6
if(p.isFulFilled()){
console.log(p.value());
}
if(p.isRejected()){
console.log(p.reason());
}






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