← Wszystkie zadaniaJavaScript · Middle

debounce

Napisz funkcję debounce(fn, ms). Zwraca ona opakowanie, które wywołuje fn dopiero ms milisekund po ostatnim wywołaniu opakowania. Każde nowe wywołanie zaczyna odliczanie od nowa.

fn dostaje argumenty ostatniego wywołania i ten sam this, z którym wywołano opakowanie. Tak zwykle ogranicza się wyszukiwanie podczas pisania: zapytanie idzie, gdy użytkownik przestanie pisać.

Testy (4)

  1. const f = fn();
    const d = debounce(f, 50);
    d(1); d(2); d(3);
    expect(f).toHaveBeenCalledTimes(0);
    await wait(80);
    expect(f).toHaveBeenCalledTimes(1);
    expect(f).toHaveBeenLastCalledWith(3);
  2. const f = fn();
    const d = debounce(f, 50);
    d('a');
    await wait(30);
    d('b');
    await wait(30);
    expect(f).toHaveBeenCalledTimes(0);
    await wait(45);
    expect(f).toHaveBeenCalledTimes(1);
    expect(f).toHaveBeenLastCalledWith('b');
  3. const f = fn();
    const d = debounce(f, 30);
    d(1);
    await wait(50);
    d(2);
    await wait(50);
    expect(f).toHaveBeenCalledTimes(2);
  4. let seen;
    const obj = { value: 42 };
    obj.read = debounce(function () { seen = this.value; }, 20);
    obj.read();
    await wait(40);
    expect(seen).toBe(42);