/**
 * 交互工具类</br>
 * 引用方式：<b>this.interactionUtil.&lt;method_name&gt;</b></br>
 * 其中&lt;method_name&gt;包括：
 * 
 * @property {method} debounce(func,delay) 防抖处理<br/>
 *    参数： func = {function} 需要防抖处理的方法<br/>
 *           &emsp;&emsp;&emsp;&ensp;delay = {number} 等待时间，单位是毫秒，默认1000毫秒<br/>
 *    返回： function = 防抖处理后的方法<br/>
 * 
 * @property {method} throttle(func,delay) 节流处理<br/>
 *    参数： func = {function} 需要节流处理的方法<br/>
 *           &emsp;&emsp;&emsp;&ensp;delay = {number} 等待时间，单位是毫秒，默认2000毫秒<br/>
 *    返回： function = 节流处理后的方法<br/>
 * 
 * @Author: shh
 * @Date: 2024-09-02 10:43:52
 */

let InteractionUtil = {
	/**
	 * @Description: 防抖处理（确保在指定的时间间隔结束后执行一次函数，如果这段时间内多次触发事件，则只有最后一次事件会在延迟后执行函数）
	 * 实现逻辑：由于使用闭包，使得timer不被回收，每次调用该方法时会去判断timer是否存在，如果存在，
	 * 表示上一次操作在等待执行func(...arguments)，期间如果继续操作，且在delay时间内，则会把上一次未执行的（setTimeout中的）func(...arguments)销毁，
	 * 重新定时，以此来达到触发结束超过delay时间才执行func(...arguments)，即触发事件。
	 * 注: 使用...arguments可以捕获并传递所有传递给防抖函数的参数给原始函数，确保原始函数能够接收到正确的参数值。
	 * @Author: shh
	 * @Date: 2024-09-02 10:43:52
	 * @param {function} func 需要防抖处理的方法
	 * @param {number} delay 等待时间，单位是毫秒，默认1000毫秒
	 * @return {function} 防抖处理后的方法
	 */
	debounce(func, delay = 1000) {
		let timer = null;
		return function() {
			if (timer != null) {
				clearTimeout(timer);
			}
			timer = setTimeout(() => {
				func(...arguments)
				clearTimeout(timer);
			}, delay);
		}
	},
	
	/**
	 * @Description: 节流处理（控制高频事件执行次数，确保在指定的时间间隔内最多执行一次函数，无论在这段时间内触发了多少次事件，只有第一次事件会立即执行函数）
	 * 实现逻辑：由于使用闭包，使得flag不被回收，每次调用该方法时会去判断flag是否有效(true)，如果有效，则不超过时间间隔，不往下执行func(...arguments)
	 * 反之立即执行func(...arguments)，并且在时间间隔内把flag置为无效(false)，超过时间间隔把状态位flag设为有效。
	 * @Author: shh
	 * @Date: 2024-09-02 10:43:52
	 * @param {function} func 需要节流处理的方法
	 * @param {number} delay 等待时间，单位是毫秒，默认2000毫秒
	 * @return {function} 节流处理后的方法
	 */
	throttle(func, delay = 2000) {
		let flag = true;
		return function() {
			if (!flag) {
				return;
			}
			
			func(...arguments);
			flag = false;
			setTimeout(() => {
				flag = true;		
			}, delay);
		}
	},
}
export default InteractionUtil