节流防抖是两个不同的函数,但是其作用都是为了优化请求次数,
// 函数节流
function throttle (fn, gapTime) {
if (gapTime === null || gapTime === undefined) {
gapTime = 2500
}
let _lastTime = null
return function () {
let _nowTime = +new Date()
if (_nowTime - _lastTime > gapTime || !_lastTime) {
fn.apply(this, arguments)
_lastTime = _nowTime
}
}
}
节流函数:例如在疯狂的点击按钮时,在规定时间内,只触发第一次,当你第二点击的时候,因为当前时间和上一次点击的时间差小于你设定的时间,所以就不会进入if里执行你的自定义函数,在时间差大于你设定的时间后,马上就又可以触发第二次,以此类推,就是说,你规定了2秒钟,那么他只能在2秒钟内触发你第一次的点击。
// 函数防抖
function debounce (fn, interval) {
var timer
var gapTime = interval || 1000
return function (e) {
clearTimeout(timer)
var context = this
timer = setTimeout(function () {
fn.call(context, e)
}, gapTime)
}
}
防抖函数:还是例如疯狂的点击按钮,如果你设定了2秒钟。你在2秒钟内疯狂点击,因为写有clearTimeout,每一次点击都会清除掉上一次的定时器,定时器里面的自定义函数就不会触发。只有你在不点的时候,2秒钟延时过后,这一次点击事件才会触发。意思是说,在规定时间内,只触发最后一次,不管点击多少次,都只触发最后一次,多用于表单提交之类的,防止多次提交。
使用方法,以微信小程序为例,一般这类共用函数都放在utils里。
先引入
import utils from '../../utils/index'
这里定义了一个支付的函数payorder,因为防抖函数里修改了this指针,所以这里可以直接使用this关键字。
payOrder: utils.debounce(async function () {
let params = {
orderId: this.orderId,
totalfee: this.totalfee
}
let Payment = await getPayment(params)
if (Payment.data !== '调用微信统一下单接口失败') {
wx.requestPayment({
timeStamp: `${Payment.data.timeStamp}`,
nonceStr: Payment.data.nonceStr,
package: Payment.data.package,
signType: 'MD5',
paySign: Payment.data.paySign,
success (res) {
console.log(res)
},
fail (res) {
console.log(res)
}
})
}
}, 2000),