Skip to content

Instantly share code, notes, and snippets.

@slavafomin
Created November 27, 2023 16:16
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 slavafomin/b56423b1f4f81cd3c693f2327357802d to your computer and use it in GitHub Desktop.
Save slavafomin/b56423b1f4f81cd3c693f2327357802d to your computer and use it in GitHub Desktop.
/**
* This module implements ECMAScript (stage-3) proposal:
* Promise with resolvers:
* https://github.com/tc39/proposal-promise-with-resolvers
*
* Copyright 2023 Slava Fomin II
*
* Permission is hereby granted, free of charge, to any
* person obtaining a copy of this software and associated
* documentation files (the “Software”), to deal in the
* Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice
* shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
export interface PromiseWithResolvers<Type = unknown> {
promise: Promise<Type>;
resolve: ResolveFunc<Type>;
reject: RejectFunc;
}
export type ResolveFunc<Type = unknown> = (
(value: (Type | PromiseLike<Type>)) => void
);
export type RejectFunc = (
(reason?: any) => void
);
export function promiseWithResolvers<
Type = unknown
>(): PromiseWithResolvers<Type> {
let resolve: (ResolveFunc<Type> | undefined);
let reject: (RejectFunc | undefined);
const promise = new Promise<Type>(
($resolve, $reject) => {
resolve = $resolve;
reject = $reject;
}
);
// Type safety
if (!resolve || !reject) {
throw new ReferenceError();
}
return {
promise,
resolve,
reject,
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment