Skip to content

Commit

Permalink
Fix debounce timeout trigger (#293)
Browse files Browse the repository at this point in the history
* Add tests for a timeout bug

* Update test with trigger check

* Fix the bug

* Unrelated change - better name for internal effect, so it is easier to see in the logs

* Better name for throttle timer too

* use guard as peer dep requries
  • Loading branch information
AlexandrHoroshih authored Sep 12, 2023
1 parent f439c04 commit 9776334
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
28 changes: 28 additions & 0 deletions src/debounce/debounce.fork.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
createEvent,
createStore,
sample,
createWatch,
} from 'effector';
import { wait, watch } from '../../test-library';

Expand Down Expand Up @@ -203,4 +204,31 @@ describe('edge cases', () => {
expect(listener).toBeCalledTimes(1);
expect(listener).toBeCalledWith('two');
});

test('no trigger call, but timeout change on the fly', async () => {
const trigger = createEvent();

const changeTimeout = createEvent<number>();
const $timeout = createStore(40).on(changeTimeout, (_, x) => x);
const db = debounce({ source: trigger, timeout: $timeout });

const listener = jest.fn();
const triggerListener = jest.fn();
const scope = fork()
createWatch({
unit: db,
fn: listener,
scope,
})
createWatch({
unit: trigger,
fn: triggerListener,
scope,
})

await allSettled(changeTimeout, { scope, params: 10 });

expect(listener).toBeCalledTimes(0);
expect(triggerListener).toBeCalledTimes(0);
})
});
3 changes: 2 additions & 1 deletion src/debounce/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export function debounce<T>({
});
});
const timerFx = attach({
name: `debounce(${source.shortName || source.kind}) effect`,
source: {
timeoutId: $timeoutId,
rejectPromise: $rejecter,
Expand Down Expand Up @@ -126,7 +127,7 @@ export function debounce<T>({
const requestTick = merge([
source,
// debounce timeout is restarted on timeout change
$timeout,
guard({ clock: $timeout, filter: timerFx.pending }),
]);

guard({
Expand Down
7 changes: 4 additions & 3 deletions src/throttle/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ export function throttle<T>({

const $timeout = toStoreNumber(timeout);

const timerFx = createEffect<number, void>(
(timeout) => new Promise((resolve) => setTimeout(resolve, timeout)),
);
const timerFx = createEffect<number, void>({
name: `throttle(${(source as Event<T>).shortName || source.kind}) effect`,
handler: (timeout) => new Promise((resolve) => setTimeout(resolve, timeout)),
});

// It's ok - nothing will ever start unless source is triggered
const $payload = createStore<T>(null as unknown as T, { serialize: 'ignore' }).on(
Expand Down

1 comment on commit 9776334

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚛 size-compare report

Comparing f439c040...97763341

File +/- Base Current +/- gzip Base gzip Current gzip
dist/and/index.cjs = 397 B 397 B = 251 B 251 B
dist/and/index.js = 413 B 413 B = 245 B 245 B
dist/babel-preset.cjs = 434 B 434 B = 249 B 249 B
dist/combine-events/index.cjs = 2.46 kB 2.46 kB = 841 B 841 B
dist/combine-events/index.js = 3.95 kB 3.95 kB = 1.35 kB 1.35 kB
dist/condition/index.cjs = 1.37 kB 1.37 kB = 505 B 505 B
dist/condition/index.js = 1.29 kB 1.29 kB = 461 B 461 B
dist/debounce/index.cjs +5.57% 3.99 kB 4.21 kB +4.59% 1.31 kB 1.37 kB
dist/debounce/index.js +5.66% 3.84 kB 4.05 kB +4.58% 1.29 kB 1.35 kB
dist/debug/index.cjs = 11.3 kB 11.3 kB = 3.16 kB 3.16 kB
dist/debug/index.js = 13.3 kB 13.3 kB = 3.79 kB 3.79 kB
dist/delay/index.cjs = 1.79 kB 1.79 kB = 727 B 727 B
dist/delay/index.js = 1.84 kB 1.84 kB = 719 B 719 B
dist/either/index.cjs = 600 B 600 B = 334 B 334 B
dist/either/index.js = 477 B 477 B = 270 B 270 B
dist/empty/index.cjs = 175 B 175 B = 151 B 151 B
dist/empty/index.js = 79 B 79 B = 89 B 89 B
dist/equals/index.cjs = 336 B 336 B = 249 B 249 B
dist/equals/index.js = 221 B 221 B = 179 B 179 B
dist/every/index.cjs = 1.22 kB 1.22 kB = 513 B 513 B
dist/every/index.js = 1.08 kB 1.08 kB = 442 B 442 B
dist/format/index.cjs = 642 B 642 B = 366 B 366 B
dist/format/index.js = 687 B 687 B = 368 B 368 B
dist/in-flight/index.cjs = 641 B 641 B = 357 B 357 B
dist/in-flight/index.js = 546 B 546 B = 305 B 305 B
dist/index.cjs = 1.62 kB 1.62 kB = 369 B 369 B
dist/index.js = 1.13 kB 1.13 kB = 285 B 285 B
dist/interval/index.cjs = 4.26 kB 4.26 kB = 1.27 kB 1.27 kB
dist/interval/index.js = 4.09 kB 4.09 kB = 1.25 kB 1.25 kB
dist/macro.cjs = 1.91 kB 1.91 kB = 808 B 808 B
dist/not/index.cjs = 161 B 161 B = 148 B 148 B
dist/not/index.js = 69 B 69 B = 81 B 81 B
dist/once/index.cjs = 597 B 597 B = 308 B 308 B
dist/once/index.js = 465 B 465 B = 242 B 242 B
dist/or/index.cjs = 393 B 393 B = 249 B 249 B
dist/or/index.js = 411 B 411 B = 245 B 245 B
dist/patronum.cjs +0.96% 19.3 kB 19.5 kB +0.88% 6.12 kB 6.18 kB
dist/patronum.js +1.06% 18.2 kB 18.4 kB +0.87% 6.17 kB 6.23 kB
dist/patronum.umd.js +0.94% 20.4 kB 20.6 kB +0.87% 6.22 kB 6.28 kB
dist/pending/index.cjs = 909 B 909 B = 495 B 495 B
dist/pending/index.js = 828 B 828 B = 444 B 444 B
dist/reset/index.cjs = 526 B 526 B = 312 B 312 B
dist/reset/index.js = 439 B 439 B = 256 B 256 B
dist/reshape/index.cjs = 419 B 419 B = 242 B 242 B
dist/reshape/index.js = 379 B 379 B = 201 B 201 B
dist/snapshot/index.cjs = 763 B 763 B = 350 B 350 B
dist/snapshot/index.js = 648 B 648 B = 292 B 292 B
dist/some/index.cjs = 1.16 kB 1.16 kB = 474 B 474 B
dist/some/index.js = 1.02 kB 1.02 kB = 407 B 407 B
dist/split-map/index.cjs = 628 B 628 B = 359 B 359 B
dist/split-map/index.js = 575 B 575 B = 318 B 318 B
dist/spread/index.cjs = 1.26 kB 1.26 kB = 534 B 534 B
dist/spread/index.js = 1.28 kB 1.28 kB = 516 B 516 B
dist/status/index.cjs = 426 B 426 B = 265 B 265 B
dist/status/index.js = 339 B 339 B = 208 B 208 B
dist/throttle/index.cjs +4.00% 2.1 kB 2.19 kB +5.41% 814 B 858 B
dist/throttle/index.js +4.72% 1.99 kB 2.08 kB +5.55% 775 B 818 B
dist/time/index.cjs = 719 B 719 B = 376 B 376 B
dist/time/index.js = 621 B 621 B = 323 B 323 B

Please sign in to comment.