Skip to content

Instantly share code, notes, and snippets.

@noseratio
Last active September 27, 2022 13:30
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save noseratio/da756d5bd1360cafa6eabc4d475a9ab7 to your computer and use it in GitHub Desktop.
Save noseratio/da756d5bd1360cafa6eabc4d475a9ab7 to your computer and use it in GitHub Desktop.
Create a thenable Deffered object in TypeScript
// A simple take at implementing Deferred as "thenable" object in TypeScript
// https://dev.to/noseratio/we-can-make-any-javascript-object-await-able-with-then-method-1apl
// https://gist.github.com/noseratio/da756d5bd1360cafa6eabc4d475a9ab7
type Resolve<T> = (v: T) => void;
type Reject = (e: Error) => void;
interface IDeferred<T> {
resolve: Resolve<T>;
reject: Reject;
then(onResolved: Resolve<T>, onRejected: Reject): Promise<unknown>;
}
function createDeferred<T = void>(): IDeferred<T> {
let resolve: Resolve<T> | undefined, reject: Reject | undefined;
const promise = new Promise<T>((...args) =>
[resolve, reject] = args);
return Object.freeze(<IDeferred<T>>{
resolve: resolve!,
reject: reject!,
then: (...args) => promise.then(...args)
});
}
async function main() {
const d = createDeferred();
setTimeout(() => d.resolve(), 1000);
await d;
alert("done");
}
main().catch(e => alert(e.message));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment