Skip to content

Instantly share code, notes, and snippets.

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 xgrommx/9146251 to your computer and use it in GitHub Desktop.
Save xgrommx/9146251 to your computer and use it in GitHub Desktop.
/**
* Decorator to add 'transform' and 'transformError' methods to promises.
* These can manipulate the result without catching errors so the 'then'
* functions will still work as expected.
*/
$provide.decorator('$q', function($delegate) {
var defer = $delegate.defer;
$delegate.defer = function() {
var deferred = defer();
deferred.promise.transform = function(fn) {
var defer = $delegate.defer();
deferred.promise.then(function(value) {
defer.resolve(fn(value));
}, function(value) {
defer.reject(value);
});
return defer.promise;
};
deferred.promise.transformError = function(fn) {
var defer = $delegate.defer();
deferred.promise.then(function(value) {
defer.resolve(value);
}, function(value) {
defer.reject(fn(value));
});
return defer.promise;
};
return deferred;
};
return $delegate;
});
/**
* Usage example:
*/
var promise = (function() {
var defer = $q.defer();
$timeout(function() {
defer.resolve(6);
}, 1000);
return defer.promise;
})();
promise
.transform(function(data) {
return data + 2;
})
.transform(function(data) {
return data * 2;
})
.transformError(function(data) {
return data / 2;
})
.transformError(function(data) {
return data + 2;
})
.then(function(data) {
console.log(data); // 16 on resolve
}, function(data) {
console.log(data); // 5 on reject
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment