| 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. | 
|    * @type {boolean} | 
|    * @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. | 
|    * @type {any} | 
|    * @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; | 
|     } | 
|   } | 
| } |