【发布时间】:2018-05-13 09:03:36
【问题描述】:
背景
假设您有一个应用程序,当您提出请求时会收到大量信息。在我关于餐馆的应用中,我想在每次收到包含几家餐馆的请求时计算所有菜单的平均价格:
var avg = menus => {
const sum = menus.reduce( ( sum, currMenu ) => currMenu.price + sum , 0);
console.log( sum / menus.length );
};
我们的解决方案
问题是我的应用程序开始滞后了这么多餐馆!解决方案?好吧,由于用户不关心每 0.001 毫秒更新一次的平均值,我们决定使用 debounce 来显示每 100 毫秒左右的更新平均值:
var debounceAvg = _.debounce( avg, 100 );
有关 debounce 工作原理的文章,请在此处阅读:
问题
所以,现在我们有了一个去抖动功能。为了测试它,我有一个测试功能:
var myMenus = [ { price: 1 }, { price: 2 }, { price: 3 } ];
var timer = setInterval( params => {
console.log("executing timer");
debounceAvg(params);
}, 20, myMenus );
setTimeout( () => { clearInterval(timer) }, 5000);
此函数应每 100 毫秒将所有菜单的平均价格打印到日志中,即使它每 20 毫秒调用一次。但是,我最终只得到 2 个包含平均价格的日志——第一个和最后一个。
问题
我做错了什么?
【问题讨论】:
-
您要求函数在等待期的前沿触发,因此它总是会在调用后立即触发。
-
循环不是测试去抖动的最佳方法。整个事情瞬间执行。
-
@Pointy 第一个调用将立即执行。第二个必须等待 100 毫秒。
-
@ibrahimmahrir 这就是为什么我有一个非常非常大的数字。但结果永远不会改变....
-
@Flame_Phoenix 不,据我所知,这不是它的工作原理。 编辑好吧,也许你是对的,但我认为斯宾克斯先生的回答是真实的故事。
标签: javascript underscore.js lodash debouncing