Javascript 我是否应该在使用(蓝鸟)承诺的代码中完全消除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

在调用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 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非常合适。当然,您可以在
    if
    中执行req中的
    “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对,这就是你应该做的。同步函数不应该完全使用承诺。