pydash icon indicating copy to clipboard operation
pydash copied to clipboard

Pydash.debounce is instead throttling the function

Open theQuazz opened this issue 3 years ago • 1 comments

Expected Behaviour

When invoked, the debounced function is invoked after wait milliseconds.

Current Behaviour

When invoked, the debounced function is invoked immediately, not after wait milliseconds.

Example

import time
import pydash

t = time.time()
func = pydash.debounce(time.time, 10000)
print(func() - t) # 2.86102294921875e-05
time.sleep(5)
print(func() - t) # 2.86102294921875e-05

Reason

As can be seen in the code below, taken from the source, there is no deferred execution. This is correct for a throttle function, but not for a debounce function, at least in the namesake project Lodash.

class Debounce(object):
    """Wrap a function in a debounce context."""

    def __init__(self, func, wait, max_wait=False):
        self.func = func
        self.wait = wait
        self.max_wait = max_wait

        self.last_result = None

        # Initialize last_* times to be prior to the wait periods so that func
        # is primed to be executed on first call.
        self.last_call = pyd.now() - self.wait
        self.last_execution = pyd.now() - max_wait if pyd.is_number(max_wait) else None

    def __call__(self, *args, **kwargs):
        """
        Execute :attr:`func` if function hasn't been called witinin last :attr:`wait` milliseconds
        or in last :attr:`max_wait` milliseconds.

        Return results of last successful call.
        """
        present = pyd.now()

        if (present - self.last_call) >= self.wait or (
            self.max_wait and (present - self.last_execution) >= self.max_wait
        ):
            self.last_result = self.func(*args, **kwargs)
            self.last_execution = present

        self.last_call = present

        return self.last_result

theQuazz avatar Sep 08 '21 22:09 theQuazz

Thanks for reporting! I'm open to a PR to fix this if you are so inclined.

dgilland avatar Sep 13 '21 22:09 dgilland