【发布时间】:2022-01-14 12:49:58
【问题描述】:
我正在尝试返回一个函数,该函数仅每“等待”毫秒调用一次回调函数“func”。
在“等待”期间对回调“func”的额外调用不应被调用或排队。
这就是我目前所拥有的......
function throttle(func, wait) {
function inner(...args) {
setInterval(func(...args), wait);
}
return inner;
}
当我通过测试算法运行代码时,出现以下错误:
- “节流函数应该只能在指定时间后才能再次调用”
这是测试算法...
let counter = 0;
const incr = () => counter++;
const throttledIncr = throttle(incr, 32);
throttledIncr();
throttledIncr();
setTimeout(() => {
expect(counter).to.eql(1);
throttledIncr();
setTimeout(() => {
expect(counter).to.eql(2);
done();
}, 32);
}, 32);
- “节流函数返回它们的值”
这是测试算法...
let counter = 0;
const incr = () => ++counter;
const throttledIncr = throttle(incr, 32);
const result = throttledIncr();
setTimeout(() => {
expect(result).to.eql(1);
expect(counter).to.eql(1);
done();
}, 64);
- “重复调用的节流函数应遵守时间限制”
这是测试算法...
const incr = () => ++counter;
const throttledIncr = throttle(incr, 64);
const results = [];
const saveResult = () => results.push(throttledIncr());
saveResult();
saveResult();
setTimeout(saveResult, 32);
setTimeout(saveResult, 80);
setTimeout(saveResult, 96);
setTimeout(saveResult, 180);
setTimeout(() => {
expect(results[0]).to.eql(1);
expect(results[1]).to.be(undefined);
expect(results[2]).to.be(undefined);
expect(results[3]).to.eql(2);
expect(results[4]).to.be(undefined);
expect(results[5]).to.eql(3);
done();
}, 192);
我对每个案例的问题:
- 如何防止函数再次被调用?
- 为什么 ISNT 我的函数返回值?我无法用给定的测试算法推断出什么或如何返回一个值。
- “重复调用的节流函数应遵守时间限制”是什么意思?这似乎与第一个错误相矛盾。没有提到设置时间限制,所以我不相信在这里使用 setTimeout 是他们的意思......
【问题讨论】:
标签: javascript callback setinterval throttling