maxtaco / coffee-script

IcedCoffeeScript
http://maxtaco.github.com/coffee-script
MIT License
727 stars 58 forks source link

How can I use await/defer to handle passing success and error callbacks? #120

Open carn1x opened 10 years ago

carn1x commented 10 years ago

For instance take the following code:

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

And then to call the function

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

If I'm passing multiple callbacks, none of which are guaranteed to be called, how can I structure await/defer for this case? Or do I need to totally rethink my code to only provide a single callback and then evaluate the presence of an error within that?

maxtaco commented 10 years ago

I would write a converter function to convert it to a one-callback convection.

converter = (cb) ->
   cb_success = (args...) -> cb null, args...
   cb_error = (err) -> cb err
   return [cb_error, cb_success]

await getThing thing_id, converter(defer(err,res))...
console.log err
console.log res
doublerebel commented 9 years ago

For reference, I've also used iced.Rendezvous for similar situations. However, it may be overkill for a simple case.