如何使用await / defer来处理传递成功和错误回调?

时间:2014-05-11 04:46:18

标签: iced-coffeescript

例如,请使用以下代码:

getThing = (thing_id, cb_success, cb_error)  ->
  model.findById thing_id, 
    (error, thing) ->
      if error || !thing 
        cb_error "error" 
      else
        cb_success thing

然后调用函数

getThing thing_id
, (thing) ->
  console.log "Found a thing!"
, (error) 
  console.log" Uh oh..."

如果我传递了多个回调,但没有一个回调可以保证被调用,我怎样才能构造等待/延迟这种情况呢?或者我是否需要完全重新考虑我的代码以仅提供一个回调,然后评估其中是否存在错误?

2 个答案:

答案 0 :(得分:0)

你可以调用一个中间函数,比如从两个函数中完成,然后在await / defer块中调用这个新的包装函数。

https://gist.github.com/maxtaco/2683cbc3379a95b6703f

答案 1 :(得分:0)

Iced CoffeeScript期望它用作延续的单个回调。在某些情况下,使用像你习惯的回调更有意义。

  • 如果一次总是调用一个回调,请合并它们并使用await

  • 如果回调可能被调用为零次或多次,请不要使用await - 而是传递回调函数。

例如,Node.js的异步filesystem APIawait的绝佳候选者,因为在继续之前需要它返回一个值:

await fs.stat somePath, defer(err, stats)

...但是一个HTTP服务器,其回调可能被多次调用,必须是正常的回调:

http.createServer (req, res) ->
   # handle the request

在您的情况下,如果您要使用Iced CoffeeScript,则重构更有意义,以便您的方法只需一次回调。