Cancellation.ts
83 lines
| 1.9 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r49 | import { ICancellation, IDestroyable } from "./interfaces"; | ||
|
|
r76 | import { argumentNotNull, destroyed } from "./safe"; | ||
|
|
r49 | |||
| export class Cancellation implements ICancellation { | ||||
| private _reason: any; | ||||
|
|
r115 | private _cbs: Array<(e: any) => void> | undefined; | ||
|
|
r49 | |||
|
|
r76 | constructor(action: (cancel: (e?: any) => void) => void) { | ||
|
|
r49 | argumentNotNull(action, "action"); | ||
| action(this._cancel.bind(this)); | ||||
| } | ||||
| isSupported(): boolean { | ||||
| return true; | ||||
| } | ||||
| throwIfRequested(): void { | ||||
| if (this._reason) | ||||
| throw this._reason; | ||||
| } | ||||
| isRequested(): boolean { | ||||
| return !!this._reason; | ||||
| } | ||||
| register(cb: (e: any) => void): IDestroyable { | ||||
| argumentNotNull(cb, "cb"); | ||||
| if (this._reason) { | ||||
| cb(this._reason); | ||||
| return destroyed; | ||||
| } else { | ||||
| if (!this._cbs) | ||||
| this._cbs = [cb]; | ||||
| else | ||||
| this._cbs.push(cb); | ||||
| const me = this; | ||||
| return { | ||||
| destroy() { | ||||
| me._unregister(cb); | ||||
| } | ||||
| }; | ||||
| } | ||||
| } | ||||
|
|
r115 | private _unregister(cb: any) { | ||
|
|
r49 | if (this._cbs) { | ||
| const i = this._cbs.indexOf(cb); | ||||
| if (i >= 0) | ||||
| this._cbs.splice(i, 1); | ||||
| } | ||||
| } | ||||
|
|
r115 | private _cancel(reason: any) { | ||
|
|
r49 | if (this._reason) | ||
| return; | ||||
| this._reason = (reason = reason || new Error("Operation cancelled")); | ||||
| if (this._cbs) { | ||||
| this._cbs.forEach(cb => cb(reason)); | ||||
|
|
r115 | this._cbs = undefined; | ||
|
|
r49 | } | ||
| } | ||||
| static readonly none: ICancellation = { | ||||
| isSupported(): boolean { | ||||
| return false; | ||||
| }, | ||||
| throwIfRequested(): void { | ||||
| }, | ||||
| isRequested(): boolean { | ||||
| return false; | ||||
| }, | ||||
| register(_cb: (e: any) => void): IDestroyable { | ||||
| return destroyed; | ||||
| } | ||||
| }; | ||||
| } | ||||
