JS手写节流(throttle)函数
概念
function myThrottle(fn, interval, { leading = true, trailling = true } = {}, callback) {
let timer = null
let lastTime = 0
function _throttle(...args) {
return new Promise((resolve, reject) => {
try {
if (timer) {
clearTimeout(timer)
timer = null
}
const nowTime = Date.now()
if (!leading && !lastTime) lastTime = nowTime
const remainTime = interval - (nowTime - lastTime)
if (remainTime <= 0) {
const res = fn.apply(this, args)
callback(res)
resolve(res)
lastTime = nowTime
return
}
if (trailling && !timer) {
timer = setTimeout(() => {
const res = fn.apply(this, args)
callback(res)
resolve(res)
lastTime = !leading ? 0 : nowTime
}, remainTime);
}
if (!trailling && !timer && !leading) {
timer = setTimeout(() => {
lastTime = 0
}, interval);
}
} catch (err) {
reject(err)
}
})
}
return _throttle
}