我正在做一个基于 下划线 _.throttle 函数的练习。我们的函数略有修改,因为如果
_.throttle
函数仍在等待执行下一个调用,我们将返回最后的计算结果。我已经成功地使油门功能正常工作,但是计算最后的结果对我来说并没有成功。
在油门功能之前我已经研究了记忆功能,我认为将两者结合起来是一个聪明的主意。我尝试了多种不同的方法来实现
_.throttle
函数中的记忆代码,但我的测试一直失败。这是我的两次尝试:
_.throttle = function (func, wait) {
let throttle = false;
let cache = {};
return function (...arguments) {
const key = JSON.stringify(arguments);
let result = func.apply(this, arguments);
cache[key] = result;
if (!throttle) {
throttle = true;
setTimeout(function () {
throttle = false;
}, wait);
return result;
} else {
return cache[key];
}
};
};
_.throttle = function (func, wait) {
let throttle = false;
let cache = {};
return function (...arguments) {
const key = JSON.stringify(arguments);
if (throttle) {
return cache[key];
}
let result = func.apply(this, arguments);
cache[key] = result;
throttle = true;
console.log(cache[key]);
setTimeout(function () {
throttle = false;
}, wait);
return result;
};
};
基本上,如果
setTimeout
尚未完成,我想返回最后的计算结果。通过 _.throttle
传递的函数会反转通过其参数传递的字符串。我尝试了上述代码的几种变体,以查明 return cache[key]
是否不在错误的位置,从而得到错误的值,但我找不到它工作的位置。我做错了什么?
提前致谢!
找到了一种无需记忆即可完全完成我想做的事情的方法。结果你只需要先初始化结果,然后保存结果。这是我如何通过测试的代码:
_.throttle = function (func, wait) {
let throttle = false;
let result;
return function (...arguments) {
if (throttle) {
return result;
}
result = func.apply(this, arguments);
throttle = true;
setTimeout(function () {
throttle = false;
}, wait);
return result;
};
};
上面的程序返回一个受限制的函数。当有很多后续调用时,调用将仅返回最后的计算结果!这可以优化程序的速度。