diff options
Diffstat (limited to 'src/ng/q.js')
| -rw-r--r-- | src/ng/q.js | 41 | 
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); +          });          }        }      }; | 
