mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-06 17:47:49 +00:00
Fixing _.throttle() to only execute once if called once. #170 comments.
This commit is contained in:
@@ -118,6 +118,22 @@ $(document).ready(function() {
|
|||||||
_.delay(function(){ ok(value == 7, "updated to latest value"); start(); }, 400);
|
_.delay(function(){ ok(value == 7, "updated to latest value"); start(); }, 400);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
asyncTest("functions: throttle once", 1, function() {
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 100);
|
||||||
|
throttledIncr();
|
||||||
|
_.delay(function(){ ok(counter == 1, "incr was called once"); start(); }, 220);
|
||||||
|
});
|
||||||
|
|
||||||
|
asyncTest("functions: throttle twice", 1, function() {
|
||||||
|
var counter = 0;
|
||||||
|
var incr = function(){ counter++; };
|
||||||
|
var throttledIncr = _.throttle(incr, 100);
|
||||||
|
throttledIncr(); throttledIncr();
|
||||||
|
_.delay(function(){ ok(counter == 2, "incr was called twice"); start(); }, 220);
|
||||||
|
});
|
||||||
|
|
||||||
asyncTest("functions: debounce", 1, function() {
|
asyncTest("functions: debounce", 1, function() {
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
var incr = function(){ counter++; };
|
var incr = function(){ counter++; };
|
||||||
|
|||||||
@@ -523,17 +523,21 @@
|
|||||||
// Returns a function, that, when invoked, will only be triggered at most once
|
// Returns a function, that, when invoked, will only be triggered at most once
|
||||||
// during a given window of time.
|
// during a given window of time.
|
||||||
_.throttle = function(func, wait) {
|
_.throttle = function(func, wait) {
|
||||||
var context, args, timeout, throttling;
|
var context, args, timeout, throttling, more;
|
||||||
var whenDone = _.debounce(function(){ throttling = false; }, wait);
|
var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
|
||||||
return function() {
|
return function() {
|
||||||
context = this; args = arguments;
|
context = this; args = arguments;
|
||||||
var later = function() {
|
var later = function() {
|
||||||
timeout = null;
|
timeout = null;
|
||||||
func.apply(context, args);
|
if (more) func.apply(context, args);
|
||||||
whenDone();
|
whenDone();
|
||||||
};
|
};
|
||||||
if (!timeout) timeout = setTimeout(later, wait);
|
if (!timeout) timeout = setTimeout(later, wait);
|
||||||
if (!throttling) func.apply(context, args);
|
if (throttling) {
|
||||||
|
more = true;
|
||||||
|
} else {
|
||||||
|
func.apply(context, args);
|
||||||
|
}
|
||||||
whenDone();
|
whenDone();
|
||||||
throttling = true;
|
throttling = true;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user