Skip to content

Instantly share code, notes, and snippets.

@celmaun
Forked from oliverfoster/deferred_promise.js
Created April 25, 2021 09:59
Show Gist options
  • Save celmaun/dfbeec42010df9208c2ee6c2a4aefa52 to your computer and use it in GitHub Desktop.
Save celmaun/dfbeec42010df9208c2ee6c2a4aefa52 to your computer and use it in GitHub Desktop.
Deferred promise
class DeferredPromise extends Promise {
constructor(def = (res, rej)=>{}) {
let res, rej;
super((resolve, reject)=>{
def(resolve, reject);
res = resolve;
rej = reject;
});
this.resolve = res;
this.reject = rej;
this.isCancelled = false;
}
cancel(err) {
this.isCancelled = true;
this.reject(err || new Error("Cancelled deferred promise."));
}
defer(task) {
this.task = task;
}
async execute(...args) {
if (!this.task) {
return this.reject(new Error("No task defined in deferred promise."));
}
try {
args.push(this);
const value = await this.task.call(this, ...args);
this.resolve(value);
} catch(err) {
this.reject(err);
}
}
}
module.exports = DeferredPromise;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment