Skip to content

Instantly share code, notes, and snippets.

@gladchinda
Last active April 6, 2021 00:44
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save gladchinda/c608027eeb43ebc89e8561b1466b260e to your computer and use it in GitHub Desktop.
function multiConsumablePromiseFactory(getPromiseFn, skipWaitingFn) {
let _this, _promise, _controller, _signal;
function _reset() {
_this = _promise = _controller = _signal = undefined;
}
function _skipWaiting() {
if (_controller instanceof AbortController) {
typeof skipWaitingFn === 'function' && skipWaitingFn.call(_this);
_controller.abort();
}
_reset();
}
function _multiConsumablePromise() {
if (!_promise) {
_promise = new Promise((resolve, reject) => {
_this = this;
_controller = new AbortController();
_signal = _controller.signal;
new Promise((resolve, reject) => {
_signal.addEventListener("abort", () => resolve());
Promise.resolve(typeof getPromiseFn === 'function' ? getPromiseFn.call(_this) : getPromiseFn)
.then(resolve, reject /* () => resolve() */);
}).then(resolve, reject);
}).finally(_reset);
}
return _promise;
}
Object.defineProperty(_multiConsumablePromise, 'skipWaiting', {
get() { return _skipWaiting }
});
return _multiConsumablePromise;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment