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

时间:2014-08-23 22:00:13

标签: javascript node.js promise bluebird livescript

在调用我的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

1 个答案:

答案 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时才有意义,这样做会将任何抛出变为拒绝,从而使函数保持安全。