Skip to content

Instantly share code, notes, and snippets.

@snewcomer
Created February 27, 2022 03:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snewcomer/adb6a3cc1608d2470b007df8c31a928d to your computer and use it in GitHub Desktop.
Save snewcomer/adb6a3cc1608d2470b007df8c31a928d to your computer and use it in GitHub Desktop.
Tap Promise
import { tracked } from '@glimmer/tracking';
import { resolve } from 'rsvp';
export class StatefulPromise {
declare promise: Promise<unknown> | null;
declare isDestroyed: boolean;
declare isDestroying: boolean;
@tracked isPending: boolean = false;
@tracked isRejected: boolean = false;
@tracked isResolved: boolean = false;
constructor(promise: Promise<unknown>) {
this.promise = tapPromise(this, promise);
}
then(success: (value: unknown) => unknown, failure: (reason: unknown) => PromiseLike<never>) {
return this.promise!.then(success, failure);
}
catch(cb: (reason: unknown) => PromiseLike<never>) {
return this.promise!.catch(cb);
}
finally(cb: () => void) {
return this.promise!.finally(cb);
}
}
function tapPromise(klass: StatefulPromise, promise: Promise<unknown>) {
klass.isPending = true;
klass.isResolved = false;
klass.isRejected = false;
return resolve(promise).then(
(content: unknown) => {
klass.isPending = false;
klass.isResolved = true;
return content;
},
(error: Error | unknown) => {
klass.isPending = false;
klass.isResolved = false;
klass.isRejected = true;
throw error;
}
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment