| "use strict"; |
| module.exports = function(Promise) { |
| var errors = require("./errors.js"); |
| var async = require("./async.js"); |
| var CancellationError = errors.CancellationError; |
| |
| Promise.prototype._cancel = function (reason) { |
| if (!this.isCancellable()) return this; |
| var parent; |
| var promiseToReject = this; |
| while ((parent = promiseToReject._cancellationParent) !== undefined && |
| parent.isCancellable()) { |
| promiseToReject = parent; |
| } |
| this._unsetCancellable(); |
| promiseToReject._target()._rejectCallback(reason, false, true); |
| }; |
| |
| Promise.prototype.cancel = function (reason) { |
| if (!this.isCancellable()) return this; |
| if (reason === undefined) reason = new CancellationError(); |
| async.invokeLater(this._cancel, this, reason); |
| return this; |
| }; |
| |
| Promise.prototype.cancellable = function () { |
| if (this._cancellable()) return this; |
| async.enableTrampoline(); |
| this._setCancellable(); |
| this._cancellationParent = undefined; |
| return this; |
| }; |
| |
| Promise.prototype.uncancellable = function () { |
| var ret = this.then(); |
| ret._unsetCancellable(); |
| return ret; |
| }; |
| |
| Promise.prototype.fork = function (didFulfill, didReject, didProgress) { |
| var ret = this._then(didFulfill, didReject, didProgress, |
| undefined, undefined); |
| |
| ret._setCancellable(); |
| ret._cancellationParent = undefined; |
| return ret; |
| }; |
| }; |