Sitemap

Throttle & Debounce behavior (lodash)

3 min readAug 23, 2017

Note: these results are received with lodash 4.17.4.

Definitions

Throttle — invokes function at most once per every X milliseconds.

Debounce — delays invoking function until after X milliseconds have elapsed since the last time the debounced function was invoked

Example

Imagine you have a function processLetter, which accepts a letter and somehow makes a processing (makes a call to some API). And you have some code which is calling your function 6 times in 45 milliseconds. This is a timeline of calls:

Press enter or click to view image in full size

And you want to apply “throttle” so that processLetter is called not more often than once in 10 msec. You create a function processLetterThrottled = _.throttle(processLetter,10) and forward all calls to it.

Which values and when processLetterThrottled will pass to original function processLetter?

Answer:

Default throttle — which has settings {leading: true, trailing: true} — will result in these values being passed to processLetter:

Press enter or click to view image in full size

What’s interesting here: “C” was omitted, but “E” was postponed till the end of 10-msec interval.

Leading Throttle — with settings {leading: true, trailing: false} — will result in these values being processed by processLetter:

Press enter or click to view image in full size

Now, “B” and “D” are omitted. Algorithm omitted “D” because throttle interval is 10 msec, and exactly 10 msec ago “C” was processed.

Trailing throttle — {leading: false, trailing: true} will result in these values being processed:

Press enter or click to view image in full size

Notice that F was processed later than it was emitted (on 55th milisecond). This is because algorithm was waiting for the end of 10-msec interval.

Debounce

Default debounce — which has settings {leading: false, trailing: true} — will pass to processLetter these values only:

Press enter or click to view image in full size

Debounce with options set to {leading: true, trailing: true} will pass to processLetter these values:

Press enter or click to view image in full size

Debounce with {leading: true} is passing first received value to debounced function. And then it works in same way as default debounce.

Debounce with {leading: true, trailing: false} will result in these values being processed.

Press enter or click to view image in full size

So, as you see, using different settings you can get different results.

I hope this visual explanation helps a lot.

--

--

Elena Sharovar
Elena Sharovar

Written by Elena Sharovar

JavaScript Tech Lead, Waverley Software

Responses (3)