在调用我的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
答案 0 :(得分:1)
嗯 - 这实际上是一个很好的问题。
如果一个函数是同步的 - 不要返回一个promise并且不要在其中使用bluebird。它比同步执行慢,而且难以调试。使用try / catch进行同步代码非常合适。您当然可以在"params" in req
中执行if
,而不是使用可能更合适的例外情况。
如果某个函数以异步方式完成其任务并返回一个promise,您可以使用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时才有意义,这样做会将任何抛出变为拒绝,从而使函数保持安全。