| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | 
							- "use strict";
 
- module.exports = function(Promise, PromiseArray, apiRejection, debug) {
 
- var util = require("./util");
 
- var tryCatch = util.tryCatch;
 
- var errorObj = util.errorObj;
 
- var async = Promise._async;
 
- Promise.prototype["break"] = Promise.prototype.cancel = function() {
 
-     if (!debug.cancellation()) return this._warn("cancellation is disabled");
 
-     var promise = this;
 
-     var child = promise;
 
-     while (promise._isCancellable()) {
 
-         if (!promise._cancelBy(child)) {
 
-             if (child._isFollowing()) {
 
-                 child._followee().cancel();
 
-             } else {
 
-                 child._cancelBranched();
 
-             }
 
-             break;
 
-         }
 
-         var parent = promise._cancellationParent;
 
-         if (parent == null || !parent._isCancellable()) {
 
-             if (promise._isFollowing()) {
 
-                 promise._followee().cancel();
 
-             } else {
 
-                 promise._cancelBranched();
 
-             }
 
-             break;
 
-         } else {
 
-             if (promise._isFollowing()) promise._followee().cancel();
 
-             promise._setWillBeCancelled();
 
-             child = promise;
 
-             promise = parent;
 
-         }
 
-     }
 
- };
 
- Promise.prototype._branchHasCancelled = function() {
 
-     this._branchesRemainingToCancel--;
 
- };
 
- Promise.prototype._enoughBranchesHaveCancelled = function() {
 
-     return this._branchesRemainingToCancel === undefined ||
 
-            this._branchesRemainingToCancel <= 0;
 
- };
 
- Promise.prototype._cancelBy = function(canceller) {
 
-     if (canceller === this) {
 
-         this._branchesRemainingToCancel = 0;
 
-         this._invokeOnCancel();
 
-         return true;
 
-     } else {
 
-         this._branchHasCancelled();
 
-         if (this._enoughBranchesHaveCancelled()) {
 
-             this._invokeOnCancel();
 
-             return true;
 
-         }
 
-     }
 
-     return false;
 
- };
 
- Promise.prototype._cancelBranched = function() {
 
-     if (this._enoughBranchesHaveCancelled()) {
 
-         this._cancel();
 
-     }
 
- };
 
- Promise.prototype._cancel = function() {
 
-     if (!this._isCancellable()) return;
 
-     this._setCancelled();
 
-     async.invoke(this._cancelPromises, this, undefined);
 
- };
 
- Promise.prototype._cancelPromises = function() {
 
-     if (this._length() > 0) this._settlePromises();
 
- };
 
- Promise.prototype._unsetOnCancel = function() {
 
-     this._onCancelField = undefined;
 
- };
 
- Promise.prototype._isCancellable = function() {
 
-     return this.isPending() && !this._isCancelled();
 
- };
 
- Promise.prototype.isCancellable = function() {
 
-     return this.isPending() && !this.isCancelled();
 
- };
 
- Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
 
-     if (util.isArray(onCancelCallback)) {
 
-         for (var i = 0; i < onCancelCallback.length; ++i) {
 
-             this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
 
-         }
 
-     } else if (onCancelCallback !== undefined) {
 
-         if (typeof onCancelCallback === "function") {
 
-             if (!internalOnly) {
 
-                 var e = tryCatch(onCancelCallback).call(this._boundValue());
 
-                 if (e === errorObj) {
 
-                     this._attachExtraTrace(e.e);
 
-                     async.throwLater(e.e);
 
-                 }
 
-             }
 
-         } else {
 
-             onCancelCallback._resultCancelled(this);
 
-         }
 
-     }
 
- };
 
- Promise.prototype._invokeOnCancel = function() {
 
-     var onCancelCallback = this._onCancel();
 
-     this._unsetOnCancel();
 
-     async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
 
- };
 
- Promise.prototype._invokeInternalOnCancel = function() {
 
-     if (this._isCancellable()) {
 
-         this._doInvokeOnCancel(this._onCancel(), true);
 
-         this._unsetOnCancel();
 
-     }
 
- };
 
- Promise.prototype._resultCancelled = function() {
 
-     this.cancel();
 
- };
 
- };
 
 
  |