def-promise
Version:
A naive deferred promise, nothing more, nothing less.
84 lines (76 loc) • 2.37 kB
JavaScript
/*
* Copyright (c) 2021 Anton Bagdatyev (Tonix)
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
/**
* @type {WeakMap}
*/
const privateScope = new WeakMap();
export default class DefPromise extends Promise {
constructor(executor = () => {}) {
let resolve, reject;
let isSettled = false,
hasResolved = false,
hasRejected = false;
super((resolveFunc, rejectFunc) => {
resolve = (...args) => {
if (!isSettled) {
isSettled = true;
hasResolved = true;
}
resolveFunc(...args);
};
reject = (...args) => {
if (!isSettled) {
isSettled = true;
hasRejected = true;
}
rejectFunc(...args);
};
executor(resolve, reject);
});
const priv = {
resolve,
reject,
isSettled: () => isSettled,
hasResolved: () => hasResolved,
hasRejected: () => hasRejected,
};
privateScope.set(this, priv);
}
resolve(...args) {
return privateScope.get(this).resolve(...args);
}
reject(...args) {
return privateScope.get(this).reject(...args);
}
isSettled() {
return privateScope.get(this).isSettled();
}
hasResolved() {
return privateScope.get(this).hasResolved();
}
hasRejected() {
return privateScope.get(this).hasRejected();
}
}