2014-04-14 46 views
1

我想知道如何链接最后Q上的错误。如何链接Q承诺与以前的错误finally()

考虑下面的代码

function p1() { 
    throw new Error("p1 error"); 
} 

function p2() { 
    throw new Error("p2 error"); 
} 

function p3() { 
    return Q.fcall(p1) 
     .finally(function() { 
      return Q.fcall(p2); 
     }); 
} 

p3() 
    .done(); 

与消息“P1误差”的误差,因为它是由覆盖错误“P2错误”丢失。我怎样才能抛出所有的错误(或结合错误)?

目前,我正在研究nodejs上的套接字连接。我使用.finally()在每次连接后关闭套接字。然而,.finally()之前的错误(例如:认证错误)将在.finally()中被覆盖1(例如:连接关闭错误)。所以,我想知道如何让所有的错误

感谢

+0

这可能会有所帮助:http://rzrsharp.net/2012/10/01/error-isolation-with-promises.html –

+0

谢谢,但链接对我的主题不是很有帮助。本博客将告诉您如何捕获承诺链以外的错误,而不是将错误处理程序放在链中的每个then()上。这种效果类似于通过抛出错误终止中间链。但是,我的情况是关于finally()的棘手部分。 finally()截获原始错误并用它的新错误替换它。 –

回答

0

你可以做这样的事情:

function p3() { 
    return Q.fcall(p1) 
    .finally(function(p) { 
     return Q.fcall(p2).catch(function(e) { 
      if (!p.isRejected()) throw e; 
      var agg = new Error("multiple errors occured"); 
      agg[0] = p.inspect().reason; 
      agg[1] = e; 
      agg.length = 2; 
      throw agg; 
     }); 
    }); 
} 

(基于Bluebird's AggregateError

当然是乏味的,但我无法想象更好的东西。