123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- let nextHandle = 1;
- // The promise needs to be created lazily otherwise it won't be patched by Zones
- let resolved: Promise<any>;
- const activeHandles: { [key: number]: any } = {};
- /**
- * Finds the handle in the list of active handles, and removes it.
- * Returns `true` if found, `false` otherwise. Used both to clear
- * Immediate scheduled tasks, and to identify if a task should be scheduled.
- */
- function findAndClearHandle(handle: number): boolean {
- if (handle in activeHandles) {
- delete activeHandles[handle];
- return true;
- }
- return false;
- }
- /**
- * Helper functions to schedule and unschedule microtasks.
- */
- export const Immediate = {
- setImmediate(cb: () => void): number {
- const handle = nextHandle++;
- activeHandles[handle] = true;
- if (!resolved) {
- resolved = Promise.resolve();
- }
- resolved.then(() => findAndClearHandle(handle) && cb());
- return handle;
- },
- clearImmediate(handle: number): void {
- findAndClearHandle(handle);
- },
- };
- /**
- * Used for internal testing purposes only. Do not export from library.
- */
- export const TestTools = {
- pending() {
- return Object.keys(activeHandles).length;
- }
- };
|