我应该完全消除从我使用的代码(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,从而使得函数的抛出变得安全。