Promise 立即处理 .catch 和 .then
Promise handle .catch and .then at once
无论 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
})
}
regardless of catch
or then
只需使用它们两者:
example(…).catch(function(err){ return err; }).then(function(value) {
console.log(value);
});
没有单一的库方法,因为这是一个非常奇怪的模式。如果不需要结果,请使用 finally
, if you care about the outcome use 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)
根据 Thomas 你的想法,这里有另一种相当简单的可能性:
// 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
因此,在这两种情况下都传递了值。如果需要,您可以检查它的类型,但如果您真的需要知道它是已解决还是被拒绝,那么单独的处理程序可能是正确的方法。
在这种情况下可以使用 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);
无论 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
})
}
regardless of
catch
orthen
只需使用它们两者:
example(…).catch(function(err){ return err; }).then(function(value) {
console.log(value);
});
没有单一的库方法,因为这是一个非常奇怪的模式。如果不需要结果,请使用 finally
, if you care about the outcome use 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)
根据 Thomas 你的想法,这里有另一种相当简单的可能性:
// 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
因此,在这两种情况下都传递了值。如果需要,您可以检查它的类型,但如果您真的需要知道它是已解决还是被拒绝,那么单独的处理程序可能是正确的方法。
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);