javascript - 在触发多个更改时仅运行一次昂贵的代码

标签 javascript jquery

我有一些输入对象。

我有一个代码可以在它们发生变化时执行某些操作 -

for (var i=0; i<100; ++i)
  my_inputs[i].on('change', function() {
    showValue($(this).val());  // Display the value it changed to
    someExpensiveOperation();  // A common refresh for any change
  });

我想将它们全部重置为 0。

for (var i=0; i<100; ++i) {
  my_inputs[i].val(0);
  my_inputs[i].change();  // Calls someExpensiveOperation 100 times!
}

重新设计代码以防止在手动重置值时调用刷新的好方法是什么? promises/deferred 在这里有帮助吗?

最佳答案

您可以消除对 someExpensiveOperation() 的调用:

 var someExpensiveOperationDebouncing = 0;

 function debouncedSomeExpensiveOperation() {
     if (someExpensiveOperationDebouncing) {
         return;
     }

     // wait at least 1/4 second before calling someExpensiveOperation again
     ++someExpensiveOperationDebouncing;
     setTimeout(function () {
         --someExpensiveOperationDebouncing;
     }, 250); 

     someExpensiveOperation.apply(this, arguments);
 }

另请查看 lodash 的 _.debounce(func, [wait], [options]) .

关于javascript - 在触发多个更改时仅运行一次昂贵的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233157/

相关文章:

php - 在 Codeigniter 中显示基于先前下拉列表的第二个下拉列表

javascript - 如何通过 Jquery 向 C# 方法发送请求并获取其参数

javascript - 使用 javascript 进行字符限制在 IE9 中不起作用

javascript - 使用像 .join() 这样的原生方法而不是我们自己编写其背后的逻辑时,效率有什么不同吗?

javascript - 为带 Angular 自举下拉菜单添加滑动效果

jquery - Fancybox 包含图像和 YouTube

javascript - 从 iOS 的控制中心隐藏 HTML 视频 URL

javascript - 如何获取输入文件的文件名并在单击按钮时再次显示它而不上传它?

javascript从外部调用内部函数

javascript - 如何使用 "<Section> tag ID"使用 Javascript\Jquery 触发 anchor 链接?