Skip to content

Instantly share code, notes, and snippets.

@bvaughn
Last active August 29, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bvaughn/878abc98a7d657e176ac to your computer and use it in GitHub Desktop.
Save bvaughn/878abc98a7d657e176ac to your computer and use it in GitHub Desktop.
Additional methods for $q
var qDecorator = function($delegate) {
/**
* Similar to $q.reject, this is a convenience method to create and resolve a Promise.
* @param {Object} data Value to resolve the promise with
* @returns {Promise} A resolved promise
*/
$delegate.resolve = function(data) {
var deferred = this.defer();
deferred.resolve(data);
return deferred.promise;
};
/**
* Similar to $q.all but waits for all promises to resolve/reject before resolving/rejecting.
* @param {Array} promises Array of promises
* @returns {Promise} A promise to be resolved or rejected once all of the observed promises complete
*/
$delegate.waitForAll = function(promises) {
var deferred = this.defer();
var results = [];
var counter = 0;
var errored = false;
var udpateResult = function(key, data) {
if (!results.hasOwnProperty(key)) {
results[key] = data;
counter--;
}
checkForDone();
};
var checkForDone = function() {
if (counter === 0) {
if (errored) {
deferred.reject(results);
} else {
deferred.resolve(results);
}
}
};
angular.forEach(promises, function(promise, key) {
counter++;
promise.then(
function(data) {
udpateResult(key, data);
},
function(data) {
errored = true;
udpateResult(key, data);
});
});
checkForDone(); // Handle empty Array
return deferred.promise;
};
return $delegate;
};
angular.module('myApp').config(
function($provide) {
$provide.decorator('$q', qDecorator);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment