我应该完全消除从我使用的代码(Bluebird)承诺的try / catch?

在我调用promisified函数之前,我有几个非常基本的设置步骤,我正在考虑将它们包装在try / catch块中,因为这似乎是最简单的方法。 不过,对我来说似乎有点肮脏。

我应该做一个返回一个Promise的函数,即使它很简单吗? 这是一个例子。

try thingyId = req.params.id # here I am 99.999% sure that params is defined, # but if for some bizarre reason it's not, I'd like to handle that error # instead of breaking the whole program catch console.log "error: " + e # do normal promisified functions 

或者我应该写这个

 setThingyId = (req) -> return new Promise (resolve, reject) !-> if req.hasOwnProperty "params" resolve req.params.id else reject new Error "no params" setThingyId(req) .then (deviceId) -> # other promisified functions 

那么 – 这实际上是一个很好的问题。

  • 如果一个函数是同步的 – 不要返回一个承诺,不要在其中使用蓝鸟。 它比同步执行慢,debugging困难。 使用try / catch同步代码是非常合适的。 你可以代替当然在所有的情况下执行"params" in req而不是在所有的情况下使用exception,这可能是更合适的。

  • 如果函数以asynchronous方式完成其任务并返回一个承诺,则可以使用Promise.method使其安全。

所以在你的情况下,我会这样做:

 setThingyId = (req) -> if req && req.params && req.params.id someCalculationOverReqId req.params.id else handleExceptionalCase req 

这是Promise.method:

 setThingyId = Promise.method (req) -> someCalculationOverReqId req.params.id 

请注意,这只有在函数返回一个promise的时候才有意义,这个函数将会抛出exception,从而使得函数的抛出变得安全。

Interesting Posts