@breakingthings's promise advice
success
/error
are not promise flow. They're pseudopromise demons. Usethen
andcatch
instead.$q.defer
is satan. You should basically never use it. There is an alternative syntax that is superior,$q(function(resolve, reject) {})
but chances are that what you’re working with already returns a promise, and if it does there is absolutely no need for either of these.- Don’t use the
promiseFn().then(successFn, errorFn)
pattern, as errorFn will only catch errors caused by promiseFn, but not by successFn. Usethen(successFn).catch(errorFn)
instead. Also note that you can chain several thenables and catch all of them this way, alathen(a).then(b).then(c).catch(errorFn)
, in which errorFn will handle errors that happen for any of a, b, or c. - Whatever you
return
from a then-able is turned into a resolving promise. Whatever youthrow
is turned into a rejecting one. For instance,.catch(function(err){ return err; })
passes the error object along to the nextthen
, it can no longer be caught withcatch
var promiseA = promiseFn(); var promiseB = promiseA.then(function(result) { return ‘hi’; });
...promiseB
’s then-able doesn’t propagate back up topromiseA
. If youpromiseA.then(…)
you’re not going to get ‘hi’ as your argument, you’re going to get the sameresult
that promiseB got. Be careful of this, as you’re “forking” the promise chain at this point
- $q documentation
- http://promise-nuggets.github.io/
- angular-ui AngularJS-StyleGuide (and read Object.js line-by-line)
- Fancier promise library: Bluebird
special thanks to hassanbazzi for advice & links