我的throttle节流函数未等待limit设定时长就执行的问题求助
问题原因
- 调用
throttle时第一个参数传入的是display("Hi"),该写法会直接执行display函数打印内容,而非将函数引用传入节流逻辑做判断控制,所以每次触发throttleDisplay都会立刻输出一次"Hi"。 - 每次调用
throttleDisplay都会生成全新的节流函数实例,每个实例的flag变量相互独立,无法共享节流状态,完全达不到节流效果。
修复方案
修改逻辑为提前创建唯一的节流函数实例,且给节流函数传入原始函数引用而非执行结果,修复后代码如下:
const display = (msg) => { console.log(msg); } const throttle = (func, limit) => { let flag = true; return function() { if(flag) { func.apply(this, arguments); flag = false; setTimeout(() => flag = true, limit); } } } // 提前创建唯一的节流函数实例,所有触发共享同一个状态 const throttledDisplay = throttle(display, 6000); for(let i=1; i<=10; i++) { // 每次触发都调用同一个节流函数,传入参数"Hi" setTimeout(() => throttledDisplay("Hi"), i*1000); }
修复后运行逻辑:10次触发分别在第1到10秒执行,按照6秒的节流间隔,最终只会在第1秒、第7秒各输出一次"Hi",符合预期。
内容的提问来源于stack exchange,提问作者myTest532 myTest532
相关产品推荐
相关产品推荐

