我的AngularJS控制器中有以下手表:
$scope.$watchCollection('vm.currentDateScheduler', function(newValue, oldValue) {
makeSomethingwithALotOfDatasets();
});
e.g。 400个数据集在方法 makeSomethingwithALotOfDatasets 中处理。 当我立即更改数据集(删除,更新或创建),然后 watchCollection 为所有400个数据集调用。 是否有可能禁止watchCollection用于其他399个数据集 - 这个问题是因为我将拥有可能的最佳性能。
非常感谢!
答案 0 :(得分:0)
我建议你看看debounce technique
。有了它,您可以控制调用某个函数的频率。 There is a short article about it。
为了简单起见,我将使用lo-dash库中的debounce
函数并将您的代码更新为:
$scope.$watchCollection('vm.currentDateScheduler', function(newValue, oldValue) {
makeSmthWithDebounce();
});
//makeSomethingwithALotOfDatasets will be called once after 100 ms from last calling of makeSmthWithDebounce function.
function makeSmthWithDebounce = _.debounce(makeSomethingwithALotOfDatasets, 100);
使用相同方法的小example on plunker。
还有throttle technique
。如果您想在特定时间段内仅调用一次函数,这将非常有用。
这两种技术都回答了同样的问题"随着时间的推移,某个功能可以多久调用一次?"以不同的方式:
- 辩解:将其视为"将多个事件分组在一个"中。想像 你回家了,进入电梯,门正在关闭...... 突然你的邻居出现在大厅里并试图跳上去 电梯。讲礼貌!为他敞开大门:你在贬值 电梯出发。考虑到同样的情况会发生 再次与第三人,等等...可能推迟了 离开几分钟。
- 节气门:把它想象成一个阀门,它 规范执行的流程。我们可以确定最大值 在特定时间内可以调用函数的次数。所以在 电梯类比..你有礼貌,让人们进入10秒, 但是一旦延迟过去,你必须去!