src/sap.ui.table/src/sap/ui/table/TableUtils.js
function invokeDebounced(vContext, vArguments) {
				cancelTimer();

				/**
				 * Executes a trailing invocation if it is enabled in the options.
				 *
				 * @param {boolean} [bFinal=true] Whether this is the final invocation.
				 */
				function _invoke(bFinal) {
					bFinal = bFinal !== false;
					if (bFinal) {
						cancel();
					}
					if (mOptions.trailing) {
						invoke(vContext, vArguments, null, bFinal);
					}
				}

				if (mOptions.requestAnimationFrame) {
					iTimerId = window.requestAnimationFrame(function() {
						_invoke();
					});
				} else {
					var iNow = Date.now();
					var iTimeSinceLastInvocation = iLastInvocationTime == null ? 0 : iNow - iLastInvocationTime;
					var iRemainingWaitTime = Math.max(0, bMaxWait ?
														 Math.min(mOptions.maxWait - iTimeSinceLastInvocation, mOptions.wait) :
														 mOptions.wait);
					var bMaxWaitInvocation = iRemainingWaitTime < mOptions.wait;

					iTimerId = setTimeout(function() {
						if (bMaxWaitInvocation) {
							var iTimerOvertime = Math.max(0, (Date.now() - iNow) - iRemainingWaitTime);
							var iCancelWaitTime = mOptions.wait - iRemainingWaitTime;
							if (iTimerOvertime > iCancelWaitTime) {
								// The timer took longer, maybe because of a long-running synchronous execution. No need to wait more.
								_invoke();
							} else {
								// Because there is some time left, the timer is restarted for cleanup. This is necessary for correct scheduling if
								// the debounced method is called again during this time.
								iTimerId = setTimeout(cancel, iCancelWaitTime - iTimerOvertime);
								_invoke(false);
							}
						} else {
							_invoke();
						}
					}, iRemainingWaitTime);
				}
			}
function invokeDebounced(vContext, vArguments) {
				cancelTimer();

				/**
				 * Executes a trailing invocation if it is enabled in the options.
				 *
				 * @param {boolean} [bFinal=true] Whether this is the final invocation.
				 */
				function _invoke(bFinal) {
					bFinal = bFinal !== false;
					if (bFinal) {
						cancel();
					}
					if (mOptions.trailing) {
						invoke(vContext, vArguments, null, bFinal);
					}
				}

				if (mOptions.requestAnimationFrame) {
					iTimerId = window.requestAnimationFrame(function() {
						_invoke();
					});
				} else {
					var iNow = Date.now();
					var iTimeSinceLastInvocation = iLastInvocationTime == null ? 0 : iNow - iLastInvocationTime;
					var iRemainingWaitTime = Math.max(0, bMaxWait ?
														 Math.min(mOptions.maxWait - iTimeSinceLastInvocation, mOptions.wait) :
														 mOptions.wait);
					var bMaxWaitInvocation = iRemainingWaitTime < mOptions.wait;

					iTimerId = setTimeout(function() {
						if (bMaxWaitInvocation) {
							var iTimerOvertime = Math.max(0, (Date.now() - iNow) - iRemainingWaitTime);
							var iCancelWaitTime = mOptions.wait - iRemainingWaitTime;
							if (iTimerOvertime > iCancelWaitTime) {
								// The timer took longer, maybe because of a long-running synchronous execution. No need to wait more.
								_invoke();
							} else {
								// Because there is some time left, the timer is restarted for cleanup. This is necessary for correct scheduling if
								// the debounced method is called again during this time.
								iTimerId = setTimeout(cancel, iCancelWaitTime - iTimerOvertime);
								_invoke(false);
							}
						} else {
							_invoke();
						}
					}, iRemainingWaitTime);
				}
			}
function invokeDebounced ( vContext , vArguments ) { cancelTimer ( ) ; /**
				 * Executes a trailing invocation if it is enabled in the options.
				 *
				 * @param {boolean} [bFinal=true] Whether this is the final invocation.
				 */ function _invoke ( bFinal ) { bFinal = bFinal !== false ; if ( bFinal ) { cancel ( ) ; } if ( mOptions . trailing ) { invoke ( vContext , vArguments , null , bFinal ) ; } } if ( mOptions . requestAnimationFrame ) { iTimerId = window . requestAnimationFrame ( function ( ) { _invoke ( ) ; } ) ; } else { var iNow = Date . now ( ) ; var iTimeSinceLastInvocation = iLastInvocationTime == null ? 0 : iNow - iLastInvocationTime ; var iRemainingWaitTime = Math . max ( 0 , bMaxWait ? Math . min ( mOptions . maxWait - iTimeSinceLastInvocation , mOptions . wait ) : mOptions . wait ) ; var bMaxWaitInvocation = iRemainingWaitTime < mOptions . wait ; iTimerId = setTimeout ( function ( ) { if ( bMaxWaitInvocation ) { var iTimerOvertime = Math . max ( 0 , ( Date . now ( ) - iNow ) - iRemainingWaitTime ) ; var iCancelWaitTime = mOptions . wait - iRemainingWaitTime ; if ( iTimerOvertime > iCancelWaitTime ) { // The timer took longer, maybe because of a long-running synchronous execution. No need to wait more. _invoke ( ) ; } else { // Because there is some time left, the timer is restarted for cleanup. This is necessary for correct scheduling if // the debounced method is called again during this time. iTimerId = setTimeout ( cancel , iCancelWaitTime - iTimerOvertime ) ; _invoke ( false ) ; } } else { _invoke ( ) ; } } , iRemainingWaitTime ) ; } }
Calls the method debounced. Multiple calls within a certain time will be reduced to one call.

@param {any} [vContext] The context of the call.
@param {Object} [vArguments] The arguments object.
Calls the method debounced . Multiple calls within a certain time will be reduced to one call .