Here’s my current (horrific) solution:
waitForTransaction: (transaction) ->
successEvents = ['didCreate', 'didUpdate', 'didDelete']
failEvents = ['becameError', 'becameInvalid']
events = [successEvents, failEvents].flatten()
dirtyRecords = transaction.get('records').toArray()
promises = dirtyRecords.map (r) ->
promise = Ember.Deferred.create()
eventHandlersForRecord = events.map (e) ->
eventHandler = ->
console.log "Got event #{e} on #{r}"
eventHandlersForRecord.each (handler) ->
r.off e, handler
result =
event: e
record: r
if e in successEvents
promise.resolve result
else
promise.reject result
r.on e, eventHandler
promise
Ember.RSVP.all promises