Skip to content

Instantly share code, notes, and snippets.

@ghengeveld
Last active August 29, 2015 13:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ghengeveld/9138015 to your computer and use it in GitHub Desktop.
Save ghengeveld/9138015 to your computer and use it in GitHub Desktop.
Decorator to add 'transform' and 'transformError' methods to $q promise chain.
/**
* 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