diff options
Diffstat (limited to 'node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts')
| -rw-r--r-- | node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts b/node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts new file mode 100644 index 0000000..b05e2e3 --- /dev/null +++ b/node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts @@ -0,0 +1,52 @@ +import { Scheduler } from '../Scheduler'; +import { Action } from './Action'; +import { AsyncAction } from './AsyncAction'; +import { TimerHandle } from './timerHandle'; + +export class AsyncScheduler extends Scheduler { + public actions: Array<AsyncAction<any>> = []; + /** + * A flag to indicate whether the Scheduler is currently executing a batch of + * queued actions. + * @internal + */ + public _active: boolean = false; + /** + * An internal ID used to track the latest asynchronous task such as those + * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and + * others. + * @internal + */ + public _scheduled: TimerHandle | undefined; + + constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) { + super(SchedulerAction, now); + } + + public flush(action: AsyncAction<any>): void { + const { actions } = this; + + if (this._active) { + actions.push(action); + return; + } + + let error: any; + this._active = true; + + do { + if ((error = action.execute(action.state, action.delay))) { + break; + } + } while ((action = actions.shift()!)); // exhaust the scheduler queue + + this._active = false; + + if (error) { + while ((action = actions.shift()!)) { + action.unsubscribe(); + } + throw error; + } + } +} |
