Skip to content

Instantly share code, notes, and snippets.

@jaydenseric
Created May 3, 2022 07:50
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 jaydenseric/13923f5ea130ad669f7d35c4aeec70ac to your computer and use it in GitHub Desktop.
Save jaydenseric/13923f5ea130ad669f7d35c4aeec70ac to your computer and use it in GitHub Desktop.
A JavaScript with TypeScript JSDoc solution for a deferred promise that can be externally resolved or rejected.
// @ts-check
/**
* A deferred promise that can be externally resolved or rejected.
* @template [Resolves=void] What the promise resolves.
*/
export default class Deferred {
constructor() {
/** The promise. */
this.promise = /** @type {Promise<Resolves>} */ (
new Promise((resolve, reject) => {
/** Resolves the promise. */
this.resolve = resolve;
/** Rejects the promise. */
this.reject = reject;
})
);
}
}
// @ts-check
import Deferred from "./Deferred.mjs";
const deferred = new Deferred();
setTimeout(() => {
deferred.resolve();
}, 1000);
// Has a void type.
const foo = await deferred.promise;
// @ts-check
import Deferred from "./Deferred.mjs";
const deferred = /** @type {Deferred<boolean>} */ (new Deferred());
setTimeout(() => {
deferred.resolve(
// TS only allows a boolean here.
true
);
}, 1000);
// Has a boolean type.
const foo = await deferred.promise;
@jaydenseric
Copy link
Author

An alternative approach (where the Deferred class extends Promise for slightly better ergonomics at the cost of more complexity) can be seen at https://gist.github.com/jaydenseric/2e9db5ab90bd92a3cf0a48f3ce87effa .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment