答应立刻处理.catch和.then

Promise handle .catch and .then at once

本文关键字:then catch 处理 答应      更新时间:2023-09-26

我想使用一个处理程序来管理以下承诺,无论catchthen。有蓝鸟的方法吗?我试过.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

因此,在两种情况下都传递值。如果需要,您可以检查它的类型,但是如果您确实需要知道它是被解析了还是被拒绝了,那么单独的处理程序可能是正确的方法。

不论catchthen

就用它们:

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);