let nextHandle = 1; // The promise needs to be created lazily otherwise it won't be patched by Zones let resolved: Promise; 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; } };