|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
module.exports = function(Promise, INTERNAL) { |
|
var errors = require("./errors.js"); |
|
var async = require("./async.js"); |
|
var ASSERT = require("./assert.js"); |
|
var CancellationError = errors.CancellationError; |
|
var SYNC_TOKEN = {}; |
|
|
|
Promise.prototype._cancel = function Promise$_cancel() { |
|
if (!this.isCancellable()) return this; |
|
var parent; |
|
if ((parent = this._cancellationParent) !== void 0) { |
|
parent.cancel(SYNC_TOKEN); |
|
return; |
|
} |
|
var err = new CancellationError(); |
|
this._attachExtraTrace(err); |
|
this._rejectUnchecked(err); |
|
}; |
|
|
|
Promise.prototype.cancel = function Promise$cancel(token) { |
|
if (!this.isCancellable()) return this; |
|
if (token === SYNC_TOKEN) { |
|
this._cancel(); |
|
return this; |
|
} |
|
async.invokeLater(this._cancel, this, void 0); |
|
return this; |
|
}; |
|
|
|
Promise.prototype.cancellable = function Promise$cancellable() { |
|
if (this._cancellable()) return this; |
|
this._setCancellable(); |
|
this._cancellationParent = void 0; |
|
return this; |
|
}; |
|
|
|
Promise.prototype.uncancellable = function Promise$uncancellable() { |
|
var ret = new Promise(INTERNAL); |
|
ret._setTrace(this.uncancellable, this); |
|
ret._follow(this); |
|
ret._unsetCancellable(); |
|
if (this._isBound()) ret._setBoundTo(this._boundTo); |
|
return ret; |
|
}; |
|
|
|
Promise.prototype.fork = |
|
function Promise$fork(didFulfill, didReject, didProgress) { |
|
var ret = this._then(didFulfill, didReject, didProgress, |
|
void 0, void 0, this.fork); |
|
|
|
ret._setCancellable(); |
|
ret._cancellationParent = void 0; |
|
return ret; |
|
}; |
|
}; |
|
|