Javascript 我是否应该在使用(蓝鸟)承诺的代码中完全消除try/catch?
在调用promisified函数之前,我有几个非常基本的设置步骤,我正在考虑将它们包装在try/catch块中,因为这似乎是最简单的方法。然而,我觉得它有点脏 我是否应该创建一个返回承诺的函数,即使它非常简单?这里有一个例子Javascript 我是否应该在使用(蓝鸟)承诺的代码中完全消除try/catch?,javascript,node.js,promise,bluebird,livescript,Javascript,Node.js,Promise,Bluebird,Livescript,在调用promisified函数之前,我有几个非常基本的设置步骤,我正在考虑将它们包装在try/catch块中,因为这似乎是最简单的方法。然而,我觉得它有点脏 我是否应该创建一个返回承诺的函数,即使它非常简单?这里有一个例子 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
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
嗯,这其实是个好问题
- 如果函数是同步的,则不要返回承诺,也不要在其中使用bluebird。它比同步执行慢,并且更难调试。对同步代码使用try/catch非常合适。当然,您可以在
中执行req中的if
“params”,而不是使用异常,这可能更合适
- 如果函数以异步方式完成其任务并返回承诺,则可以使用
使其安全抛出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
请注意,这只有在函数返回承诺时才有意义,这将有效地将任何抛出转换为拒绝,从而使函数抛出安全。如果它不依赖于异步行为,
try
/catch
完全满足您的要求。如果是这样,请将其包装为承诺。您可以处理未定义的req.params.id
,而无需将其包装为try/catch。只要检查一下,如果有,就继续,如果没有,就做点别的,好吗。它不依赖于异步行为。我会使用if…else,但是还有其他同步函数也会抛出错误,它们都可以以相同的方式处理,所以最好保持一点干爽。太棒了,谢谢。它是同步的,在设置中还有其他同步函数,所以我想我会让它们在边缘情况下也抛出异常,我可以用同样的方法捕获它们。@Californian对,这就是你应该做的。同步函数不应该完全使用承诺。