export type DeferredPromise = Promise & { resolve: ( a?: T | PromiseLike ) => void; reject: ( a?: T | PromiseLike ) => void; } /** * Deferred promise * * @example * let prom = defer() * * // To resolve: * prom.resolve() * * // To reject: * prom.reject() * * @returns - a promise with a resolve and reject function */ export function defer(): DeferredPromise { let res: (a?: T | PromiseLike ) => void, rej: (a?: T | PromiseLike ) => void; const promise = new Promise( ( resolve, reject ) => { res = resolve; rej = reject; } ) as DeferredPromise; promise.resolve = ( a?: T | PromiseLike ) => { res( a ); return promise; }; promise.reject = ( a?: T | PromiseLike )=> { rej( a ); return promise; }; return promise; }