uview 的节流防抖方法js
之前搜的网上的节流防抖JS方法在小程序中有时会出现莫名其妙的卡顿,最近用的uview框架体验上感觉还未出现问题,源码如下
节流
let timer; let flag /** * 节流原理:在一定时间内,只能触发一次 * * @param { Function} func 要执行的回调函数 * @param { Number} wait 延时的时间 * @param { Boolean} immediate 是否立即执行 * @return null */ function throttle(func, wait = 500, immediate = true) { if (immediate) { if (!flag) { flag = true // 如果是立即执行,则在wait毫秒内开始时执行 typeof func === function && func() timer = setTimeout(() => { flag = false }, wait) } } else if (!flag) { flag = true // 如果是非立即执行,则在wait毫秒内的结束处执行 timer = setTimeout(() => { flag = false typeof func === function && func() }, wait) } } export default throttle
防抖
let timeout = null /** * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数 * * @param { Function} func 要执行的回调函数 * @param { Number} wait 延时的时间 * @param { Boolean} immediate 是否立即执行 * @return null */ function debounce(func, wait = 500, immediate = false) { // 清除定时器 if (timeout !== null) clearTimeout(timeout) // 立即执行,此类情况一般用不到 if (immediate) { const callNow = !timeout timeout = setTimeout(() => { timeout = null }, wait) if (callNow) typeof func === function && func() } else { // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法 timeout = setTimeout(() => { typeof func === function && func() }, wait) } } export default debounce
2023.6.30
隐患!!!目前发现的网上的几种节流方法(PS:防抖未测试),需要节流的事件内部一旦出现报错,会导致所有调用了节流的方法全部不执行(就出现类似页面可以操作,节流的按钮点击后不触发事件),怀疑是报错导致节流方法卡死,解决办法是在节流的内部事件包一层try catch抛出异常