diff --git a/packages/react-native/Libraries/Core/Timers/JSTimers.js b/packages/react-native/Libraries/Core/Timers/JSTimers.js index 546fce413aa..7987104f86c 100644 --- a/packages/react-native/Libraries/Core/Timers/JSTimers.js +++ b/packages/react-native/Libraries/Core/Timers/JSTimers.js @@ -36,6 +36,7 @@ const IDLE_CALLBACK_FRAME_DEADLINE = 1; const callbacks: Array = []; const types: Array = []; const timerIDs: Array = []; +const freeIdxs: Array = []; let reactNativeMicrotasks: Array = []; let requestIdleCallbacks: Array = []; const requestIdleCallbackTimeouts: {[number]: number, ...} = {}; @@ -47,11 +48,11 @@ let hasEmittedTimeDriftWarning = false; // Returns a free index if one is available, and the next consecutive index otherwise. function _getFreeIndex(): number { - let freeIndex = timerIDs.indexOf(null); - if (freeIndex === -1) { - freeIndex = timerIDs.length; + const freeIdx = freeIdxs.pop(); + if (freeIdx === undefined) { + return timerIDs.length; } - return freeIndex; + return freeIdx; } function _allocateCallback(func: Function, type: JSTimerType): number { @@ -171,6 +172,7 @@ function _clearIndex(i: number) { timerIDs[i] = null; callbacks[i] = null; types[i] = null; + freeIdxs.push(i); } function _freeCallback(timerID: number) {