aboutsummaryrefslogtreecommitdiffstats
path: root/src/ng/q.js
diff options
context:
space:
mode:
authorLaurent Cozic2013-04-17 14:15:27 +0800
committerPete Bacon Darwin2013-04-24 20:56:18 +0100
commit6605adf6d96cee2ef53dfad24e99d325df732cab (patch)
treed56123d9d41c92a12fc677cc68bb70a17b282eb8 /src/ng/q.js
parentb1157aafd7e06f3acea9fccc4fe1183c3610bdea (diff)
downloadangular.js-6605adf6d96cee2ef53dfad24e99d325df732cab.tar.bz2
feat($q): add $q.always() method
Add $q.always(callback) method that is always called whether the promise is successful or fails; includes unit tests and updates documentation.
Diffstat (limited to 'src/ng/q.js')
-rw-r--r--src/ng/q.js41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/ng/q.js b/src/ng/q.js
index 33ca663a..22c9caa9 100644
--- a/src/ng/q.js
+++ b/src/ng/q.js
@@ -91,6 +91,11 @@
* This method *returns a new promise* which is resolved or rejected via the return value of the
* `successCallback` or `errorCallback`.
*
+ * - `always(callback)` – allows you to observe either the fulfillment or rejection of a promise,
+ * but to do so without modifying the final value. This is useful to release resources or do some
+ * clean-up that needs to be done whether the promise was rejected or resolved. See the [full
+ * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
+ * more information.
*
* # Chaining promises
*
@@ -236,6 +241,42 @@ function qFactory(nextTick, exceptionHandler) {
}
return result.promise;
+ },
+ always: function(callback) {
+
+ function makePromise(value, resolved) {
+ var result = defer();
+ if (resolved) {
+ result.resolve(value);
+ } else {
+ result.reject(value);
+ }
+ return result.promise;
+ }
+
+ function handleCallback(value, isResolved) {
+ var callbackOutput = null;
+ try {
+ callbackOutput = (callback ||defaultCallback)();
+ } catch(e) {
+ return makePromise(e, false);
+ }
+ if (callbackOutput && callbackOutput.then) {
+ return callbackOutput.then(function() {
+ return makePromise(value, isResolved);
+ }, function(error) {
+ return makePromise(error, false);
+ });
+ } else {
+ return makePromise(value, isResolved);
+ }
+ }
+
+ return this.then(function(value) {
+ return handleCallback(value, true);
+ }, function(error) {
+ return handleCallback(error, false);
+ });
}
}
};