MCPcopy Create free account
hub / github.com/0010aor/FlashNotes / CancelablePromise

Class CancelablePromise

frontend/src/client/core/CancelablePromise.ts:20–126  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

18}
19
20export class CancelablePromise<T> implements Promise<T> {
21 private _isResolved: boolean
22 private _isRejected: boolean
23 private _isCancelled: boolean
24 readonly cancelHandlers: (() => void)[]
25 readonly promise: Promise<T>
26 private _resolve?: (value: T | PromiseLike<T>) => void
27 private _reject?: (reason?: unknown) => void
28
29 constructor(
30 executor: (
31 resolve: (value: T | PromiseLike<T>) => void,
32 reject: (reason?: unknown) => void,
33 onCancel: OnCancel,
34 ) => void,
35 ) {
36 this._isResolved = false
37 this._isRejected = false
38 this._isCancelled = false
39 this.cancelHandlers = []
40 this.promise = new Promise<T>((resolve, reject) => {
41 this._resolve = resolve
42 this._reject = reject
43
44 const onResolve = (value: T | PromiseLike<T>): void => {
45 if (this._isResolved || this._isRejected || this._isCancelled) {
46 return
47 }
48 this._isResolved = true
49 if (this._resolve) this._resolve(value)
50 }
51
52 const onReject = (reason?: unknown): void => {
53 if (this._isResolved || this._isRejected || this._isCancelled) {
54 return
55 }
56 this._isRejected = true
57 if (this._reject) this._reject(reason)
58 }
59
60 const onCancel = (cancelHandler: () => void): void => {
61 if (this._isResolved || this._isRejected || this._isCancelled) {
62 return
63 }
64 this.cancelHandlers.push(cancelHandler)
65 }
66
67 Object.defineProperty(onCancel, 'isResolved', {
68 get: (): boolean => this._isResolved,
69 })
70
71 Object.defineProperty(onCancel, 'isRejected', {
72 get: (): boolean => this._isRejected,
73 })
74
75 Object.defineProperty(onCancel, 'isCancelled', {
76 get: (): boolean => this._isCancelled,
77 })

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected