承诺立即处理.catch和.then

时间:2015-07-18 20:33:37

标签: javascript promise bluebird

无论是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
    })
}

4 个答案:

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