2021-11-23 00:03:59 +03:00
|
|
|
export type ControllablePromise<T = any> = Promise<T> & {
|
2021-04-08 12:19:38 +03:00
|
|
|
resolve(val: T): void
|
2021-11-23 00:03:59 +03:00
|
|
|
reject(err?: unknown): void
|
2021-04-08 12:19:38 +03:00
|
|
|
}
|
|
|
|
|
2021-11-23 00:03:59 +03:00
|
|
|
export type CancellablePromise<T = any> = Promise<T> & {
|
|
|
|
cancel(): void
|
|
|
|
}
|
|
|
|
|
|
|
|
export class PromiseCancelledError extends Error {}
|
|
|
|
|
|
|
|
export function createControllablePromise<T = any>(): ControllablePromise<T> {
|
2021-04-08 12:19:38 +03:00
|
|
|
let _resolve: any
|
|
|
|
let _reject: any
|
|
|
|
const promise = new Promise<T>((resolve, reject) => {
|
|
|
|
_resolve = resolve
|
|
|
|
_reject = reject
|
|
|
|
})
|
|
|
|
;(promise as ControllablePromise<T>).resolve = _resolve
|
|
|
|
;(promise as ControllablePromise<T>).reject = _reject
|
|
|
|
return promise as ControllablePromise<T>
|
|
|
|
}
|
2021-11-23 00:03:59 +03:00
|
|
|
|
|
|
|
export function createCancellablePromise<T = any>(
|
|
|
|
onCancel: () => void
|
|
|
|
): ControllablePromise<T> & CancellablePromise<T> {
|
|
|
|
const promise = createControllablePromise()
|
2022-06-30 16:32:56 +03:00
|
|
|
;(promise as unknown as CancellablePromise<T>).cancel = () => {
|
2021-11-23 00:03:59 +03:00
|
|
|
promise.reject(new PromiseCancelledError())
|
|
|
|
onCancel()
|
|
|
|
}
|
|
|
|
return promise as ControllablePromise<T> & CancellablePromise<T>
|
|
|
|
}
|