无论是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
})
}
答案 0 :(得分:2)
基于你的想法托马斯,这是另一个相当简单的可能性:
// 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
因此,在两种情况下都会传递该值。您可以根据需要检查其类型,但如果您确实需要知道它是否已被解决或拒绝,那么单独的处理程序可能是正确的配方。
答案 1 :(得分:0)
无论
catch
还是then
只需使用两者:
example(…).catch(function(err){ return err; }).then(function(value) {
console.log(value);
});
没有单一的库方法,因为这是一个非常奇怪的模式。如果您不需要结果,请使用finally
,如果您关心结果使用reflect
。
答案 2 :(得分:0)
我确实意识到这很危险,因为它会把错误从链中带走,但它确实有效。
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)
答案 3 :(得分:0)
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);