Lodash _.debounce 具有用于唯一参数变体的单独队列
Lodash _.debounce with separate queues for unique argument variants
我非常感谢 lodash 的去抖动和节流功能。我相信我很了解用例并且已经实施了数十次。
但是,根据要求,带有参数的 _.debounce 函数可能会出现严重且难以发现的错误。即:
假设您有一个名为 debounceFn
的去抖动函数,它接受一个参数并且具有 1000 毫秒的去抖动间隔。
- 100 毫秒:
debounceFn(1)
- 200 毫秒:
debounceFn(2)
- 300 毫秒:
debounceFn(2)
- 400 毫秒:
debounceFn(1)
- 500 毫秒:
debounceFn(1)
子函数最终将以参数 1 调用。这对于您只关心最后一个值的调整大小事件非常有用,但如果您需要根据参数单独的去抖动队列怎么办?也就是说,不是使用参数 1 调用的进程,而是使用参数 1 和参数 2 调用的进程,但只调用一次(因为它们都被去抖动了)。
作为一个扩展且稍微复杂的示例,请考虑以下参数的组合,其中该组合产生一个唯一的队列。
实际输出:
a: lime b: kiwi
期望的输出(前两个输出的顺序可以翻转)
a: apple b: banana
a: apple b: orange
a: lime b: kiwi
var process = function(a, b) {
document.writeln('a: ' + a + ' b: ' + b);
};
var debounceProcess = _.debounce(function(a, b) {
process(a, b);
}, 1000);
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 100);
setTimeout(function() {
debounceProcess('apple', 'banana');
}, 200);
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 300);
setTimeout(function() {
debounceProcess('lime', 'kiwi');
}, 400);
<script src="https://cdn.rawgit.com/lodash/lodash/4.6.1/dist/lodash.min.js"></script>
我看到很多关于 _.debounce 接受争论的问题。这不再是一个有趣的问题,所以 - 如何创建单独的去抖动队列?
使用 Lodash _.debounce 函数、Lodash 库和 JavaScript 本机功能来实现此目的的优雅方法(简单易读的代码)是什么?也许是 _.debounce 和 _.memoize 的组合(我曾尝试用 _.memoize 包装 _.debounce 但需要探索以进一步理解 memoize)。或者可能是 'hash' 参数的函数,并为每个参数组合创建一个新的 _.debounce 队列?
将不同的去抖动函数存储在一个对象中,其中键代表参数。这在您的用例中效果很好,因为参数是字符串。
var process = function(a, b) {
$('body').append($('<p>').text('a: ' + a + ' b: ' + b));
};
function debounceProcess(a, b) {
if (! debounceProcess.queues) { debounceProcess.queues = {}; }
if (! debounceProcess.queues[a]) { debounceProcess.queues[a] = {}; }
if (! debounceProcess.queues[a][b]) {
debounceProcess.queues[a][b] = _.debounce(function(a, b) {
process(a, b);
}, 1000);
}
return debounceProcess.queues[a][b](a, b);
};
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 100);
setTimeout(function() {
debounceProcess('apple', 'banana');
}, 200);
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 300);
setTimeout(function() {
debounceProcess('lime', 'kiwi');
}, 400);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/lodash/lodash/4.6.1/dist/lodash.min.js"></script>
我非常感谢 lodash 的去抖动和节流功能。我相信我很了解用例并且已经实施了数十次。
但是,根据要求,带有参数的 _.debounce 函数可能会出现严重且难以发现的错误。即:
假设您有一个名为 debounceFn
的去抖动函数,它接受一个参数并且具有 1000 毫秒的去抖动间隔。
- 100 毫秒:
debounceFn(1)
- 200 毫秒:
debounceFn(2)
- 300 毫秒:
debounceFn(2)
- 400 毫秒:
debounceFn(1)
- 500 毫秒:
debounceFn(1)
子函数最终将以参数 1 调用。这对于您只关心最后一个值的调整大小事件非常有用,但如果您需要根据参数单独的去抖动队列怎么办?也就是说,不是使用参数 1 调用的进程,而是使用参数 1 和参数 2 调用的进程,但只调用一次(因为它们都被去抖动了)。
作为一个扩展且稍微复杂的示例,请考虑以下参数的组合,其中该组合产生一个唯一的队列。
实际输出:
a: lime b: kiwi
期望的输出(前两个输出的顺序可以翻转)
a: apple b: banana
a: apple b: orange
a: lime b: kiwi
var process = function(a, b) {
document.writeln('a: ' + a + ' b: ' + b);
};
var debounceProcess = _.debounce(function(a, b) {
process(a, b);
}, 1000);
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 100);
setTimeout(function() {
debounceProcess('apple', 'banana');
}, 200);
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 300);
setTimeout(function() {
debounceProcess('lime', 'kiwi');
}, 400);
<script src="https://cdn.rawgit.com/lodash/lodash/4.6.1/dist/lodash.min.js"></script>
我看到很多关于 _.debounce 接受争论的问题。这不再是一个有趣的问题,所以 - 如何创建单独的去抖动队列?
使用 Lodash _.debounce 函数、Lodash 库和 JavaScript 本机功能来实现此目的的优雅方法(简单易读的代码)是什么?也许是 _.debounce 和 _.memoize 的组合(我曾尝试用 _.memoize 包装 _.debounce 但需要探索以进一步理解 memoize)。或者可能是 'hash' 参数的函数,并为每个参数组合创建一个新的 _.debounce 队列?
将不同的去抖动函数存储在一个对象中,其中键代表参数。这在您的用例中效果很好,因为参数是字符串。
var process = function(a, b) {
$('body').append($('<p>').text('a: ' + a + ' b: ' + b));
};
function debounceProcess(a, b) {
if (! debounceProcess.queues) { debounceProcess.queues = {}; }
if (! debounceProcess.queues[a]) { debounceProcess.queues[a] = {}; }
if (! debounceProcess.queues[a][b]) {
debounceProcess.queues[a][b] = _.debounce(function(a, b) {
process(a, b);
}, 1000);
}
return debounceProcess.queues[a][b](a, b);
};
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 100);
setTimeout(function() {
debounceProcess('apple', 'banana');
}, 200);
setTimeout(function() {
debounceProcess('apple', 'orange');
}, 300);
setTimeout(function() {
debounceProcess('lime', 'kiwi');
}, 400);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/lodash/lodash/4.6.1/dist/lodash.min.js"></script>