我想使用一个处理程序来管理以下承诺,无论catch
或then
。有蓝鸟的方法吗?我试过.finally
和.done
,但没有成功。
var example = function(throwError){
return Promise.resolve().then(function(){
if(throwError) throw new Error("test error")
return throwError
})
}
example(true).SOMETHING(function(value){
console.log(value) // error
})
example(false).SOMETHING(function(value){
console.log(value) // false
})
我不想再写这样的代码了
function myPromiseCatch(){
return myPromise
.apply(null, _.values(arguments))
.catch(function(e){
return e
})
}
根据你的想法,这里有另一个相当简单的可能性:
// create method that will always get called whether reject or resolve
Promise.prototype.always = function(fn) {
return this.then(fn, fn);
};
// test function to resolve or reject based on input
function example(throwError){
return new Promise(function(resolve, reject) {
if (throwError) throw new Error("test error")
resolve(throwError);
});
}
// test that will resolve
example(false).always(function(value){
console.log("always: " + value); // false
});
// test that will reject
example(true).always(function(value) {
console.log("always: " + value); // error
});
生成如下输出:
always: false
always: Error: test error
因此,在两种情况下都传递值。如果需要,您可以检查它的类型,但是如果您确实需要知道它是被解析了还是被拒绝了,那么单独的处理程序可能是正确的方法。
不论
catch
或then
就用它们:
example(…).catch(function(err){ return err; }).then(function(value) {
console.log(value);
});
没有单独的库方法,因为这是一个非常奇怪的模式。如果你不需要结果,用finally
,如果你关心结果,用reflect
。
我确实意识到这是危险的,因为它将错误从链中取出,但它是有效的。
Promise.prototype.thenCatch = function(fn){
return this
.catch(function(e){
return e
})
.then(fn)
}
和使用。
example(true).thenCatch(function(value){
expect(value).to.exist
.and.be.instanceof(Error)
.and.have.property('message', 'test error')
}).thenCatch(done)
example(false).thenCatch(function(value){
expect(value).to.equal(false)
}).thenCatch(done)
Promise.reflect()可以在这种情况下使用。它基本上是在承诺解决后(要么实现,要么被拒绝)把承诺还给你。例子:
function good() {
return Promise.resolve(true);
}
function bad() {
return Promise.reject(new Error("bad"));
}
function check(p) {
if (p.isRejected()) {
console.log('Rejected', p.reason());
} else {
console.log('Fulfilled', p.value());
}
}
good().reflect().then(check);
bad().reflect().then(check);