From 8a07c616fa468a035473db4ed68de38f231bf896 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 11 Apr 2022 04:22:08 +0800 Subject: [PATCH] feat(promise): new `createControlledPromise` method --- src/promise.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/promise.ts b/src/promise.ts index 5627b15..4f91bb1 100644 --- a/src/promise.ts +++ b/src/promise.ts @@ -88,3 +88,36 @@ export function createPromiseLock() { }, } } + +/** + * Promise with `resolve` and `reject` methods of itself + */ +export interface ControlledPromise extends Promise { + resolve(value: T | PromiseLike): void + reject(reason?: any): void +} + +/** + * Return a Promise with `resolve` and `reject` methods + * + * @category Promise + * @example + * ``` + * const promise = createControlledPromise() + * + * await promise + * + * // in anther context: + * promise.resolve(data) + * ``` + */ +export function createControlledPromise(): ControlledPromise { + let resolve: any, reject: any + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve + reject = _reject + }) as ControlledPromise + promise.resolve = resolve + promise.reject = reject + return promise +}