2

在调用我的承诺函数之前,我有几个非常基本的设置步骤,我正在考虑将它们包装在 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
4

1 回答 1

1

嗯 - 这实际上是一个很好的问题。

  • 如果一个函数是同步的 - 不要返回一个承诺,也不要在其中使用 bluebird。它比同步执行慢,更难调试。对同步代码使用 try/catch 是非常合适的。您当然可以执行"params" in reqinif而不是使用异常,这可能更合适。

  • 如果一个函数以异步方式完成其任务并返回一个 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

请注意,这仅在函数返回一个承诺时才有意义,这将有效地将任何抛出转换为拒绝,从而使函数抛出安全。

于 2014-08-24T06:30:19.490 回答