Spaces:
Runtime error
Runtime error
; | |
import CanceledError from './CanceledError.js'; | |
/** | |
* A `CancelToken` is an object that can be used to request cancellation of an operation. | |
* | |
* @param {Function} executor The executor function. | |
* | |
* @returns {CancelToken} | |
*/ | |
class CancelToken { | |
constructor(executor) { | |
if (typeof executor !== 'function') { | |
throw new TypeError('executor must be a function.'); | |
} | |
let resolvePromise; | |
this.promise = new Promise(function promiseExecutor(resolve) { | |
resolvePromise = resolve; | |
}); | |
const token = this; | |
// eslint-disable-next-line func-names | |
this.promise.then(cancel => { | |
if (!token._listeners) return; | |
let i = token._listeners.length; | |
while (i-- > 0) { | |
token._listeners[i](cancel); | |
} | |
token._listeners = null; | |
}); | |
// eslint-disable-next-line func-names | |
this.promise.then = onfulfilled => { | |
let _resolve; | |
// eslint-disable-next-line func-names | |
const promise = new Promise(resolve => { | |
token.subscribe(resolve); | |
_resolve = resolve; | |
}).then(onfulfilled); | |
promise.cancel = function reject() { | |
token.unsubscribe(_resolve); | |
}; | |
return promise; | |
}; | |
executor(function cancel(message, config, request) { | |
if (token.reason) { | |
// Cancellation has already been requested | |
return; | |
} | |
token.reason = new CanceledError(message, config, request); | |
resolvePromise(token.reason); | |
}); | |
} | |
/** | |
* Throws a `CanceledError` if cancellation has been requested. | |
*/ | |
throwIfRequested() { | |
if (this.reason) { | |
throw this.reason; | |
} | |
} | |
/** | |
* Subscribe to the cancel signal | |
*/ | |
subscribe(listener) { | |
if (this.reason) { | |
listener(this.reason); | |
return; | |
} | |
if (this._listeners) { | |
this._listeners.push(listener); | |
} else { | |
this._listeners = [listener]; | |
} | |
} | |
/** | |
* Unsubscribe from the cancel signal | |
*/ | |
unsubscribe(listener) { | |
if (!this._listeners) { | |
return; | |
} | |
const index = this._listeners.indexOf(listener); | |
if (index !== -1) { | |
this._listeners.splice(index, 1); | |
} | |
} | |
/** | |
* Returns an object that contains a new `CancelToken` and a function that, when called, | |
* cancels the `CancelToken`. | |
*/ | |
static source() { | |
let cancel; | |
const token = new CancelToken(function executor(c) { | |
cancel = c; | |
}); | |
return { | |
token, | |
cancel | |
}; | |
} | |
} | |
export default CancelToken; | |