import { Action } from './Action'; export class AsyncAction extends Action { constructor(scheduler, work) { super(scheduler, work); this.scheduler = scheduler; this.work = work; this.pending = false; } schedule(state, delay = 0) { if (this.closed) { return this; } this.state = state; const id = this.id; const scheduler = this.scheduler; if (id != null) { this.id = this.recycleAsyncId(scheduler, id, delay); } this.pending = true; this.delay = delay; this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); return this; } requestAsyncId(scheduler, id, delay = 0) { return setInterval(scheduler.flush.bind(scheduler, this), delay); } recycleAsyncId(scheduler, id, delay = 0) { if (delay !== null && this.delay === delay && this.pending === false) { return id; } clearInterval(id); return undefined; } execute(state, delay) { if (this.closed) { return new Error('executing a cancelled action'); } this.pending = false; const error = this._execute(state, delay); if (error) { return error; } else if (this.pending === false && this.id != null) { this.id = this.recycleAsyncId(this.scheduler, this.id, null); } } _execute(state, delay) { let errored = false; let errorValue = undefined; try { this.work(state); } catch (e) { errored = true; errorValue = !!e && e || new Error(e); } if (errored) { this.unsubscribe(); return errorValue; } } _unsubscribe() { const id = this.id; const scheduler = this.scheduler; const actions = scheduler.actions; const index = actions.indexOf(this); this.work = null; this.state = null; this.pending = false; this.scheduler = null; if (index !== -1) { actions.splice(index, 1); } if (id != null) { this.id = this.recycleAsyncId(scheduler, id, null); } this.delay = null; } } //# sourceMappingURL=AsyncAction.js.map