在下划线.js的节流实现中,'remaining > wait'条件语句何时成立?



库代码(有问题的第 860 行(: https://github.com/jashkenas/underscore/blob/master/underscore.js

if (remaining <= 0 || remaining > wait)

这的后半部分什么时候是真的?

背景 - 关于SO的第一篇文章,对javascript编码非常陌生。 我从头开始重新实现了油门作为练习,并将我的版本与库函数进行比较。 我不明白为什么条件语句的这一部分存在于库函数中,因为在我看来它永远不会是真的,所以我认为我错过了一些东西。 有人可以通过提供引用的陈述为真实的情况来填写我吗?

我已经通过调试器运行它并在谷歌上搜索文章,但没有找到答案。

完整的库功能:

_.throttle = function(func, wait, options) {
var timeout, context, args, result;
var previous = 0;
if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : _.now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
var throttled = function() {
var now = _.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) { // THIS LINE
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
throttled.cancel = function() {
clearTimeout(timeout);
previous = 0;
timeout = context = args = null;
};
return throttled;
};

我无法想象"剩余"比"等待"更大。 什么时候会发生这种情况?

此条件处理在throttle处于动态状态时更改系统时间的情况。

这似乎是一个超级边缘情况,但实际上有很多原因可能会改变时间。您可以手动更改系统时间,也可以自动更改(例如,由于与ntp服务器同步(,您可以旅行并更改时区,当然,不要忘记DST。

我做了一个游乐场,你可以更深入地研究它。

此提交中引入了此条件:允许 _.throttle 在更新系统时间后正常运行。

附言我几乎在每个项目中都面临着与时间相关的问题,我非常感谢所有这些思考这些事情的人。

最新更新