Created
May 3, 2022 07:50
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @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; | |
}) | |
); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @ts-check | |
import Deferred from "./Deferred.mjs"; | |
const deferred = new Deferred(); | |
setTimeout(() => { | |
deferred.resolve(); | |
}, 1000); | |
// Has a void type. | |
const foo = await deferred.promise; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
An alternative approach (where the
Deferred
class extendsPromise
for slightly better ergonomics at the cost of more complexity) can be seen at https://gist.github.com/jaydenseric/2e9db5ab90bd92a3cf0a48f3ce87effa .