From a2c2a6644fdbd4f6d663f3dfaaa6678de70a95e1 Mon Sep 17 00:00:00 2001 From: Dor Meiri <37194716+dormeiri@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:51:00 +0200 Subject: [PATCH] Call `setTimeout` only when execution is delayed (#46) --- index.js | 10 +++++++--- test.js | 9 ++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index b3bbc6b..8336ae6 100644 --- a/index.js +++ b/index.js @@ -80,9 +80,13 @@ export default function pThrottle({limit, interval, strict}) { queue.delete(timeoutId); }; - timeoutId = setTimeout(execute, getDelay()); - - queue.set(timeoutId, reject); + const delay = getDelay(); + if (delay > 0) { + timeoutId = setTimeout(execute, delay); + queue.set(timeoutId, reject); + } else { + execute(); + } }); }; diff --git a/test.js b/test.js index f5b53cf..9a240c8 100644 --- a/test.js +++ b/test.js @@ -25,6 +25,7 @@ test('main', async t => { test('queue size', async t => { const limit = 10; const interval = 100; + const delayedExecutions = 20; const throttled = pThrottle({limit, interval})(() => Date.now()); const promises = []; @@ -34,7 +35,13 @@ test('queue size', async t => { promises.push(throttled()); } - t.is(throttled.queueSize, limit); + t.is(throttled.queueSize, 0); + + for (let index = 0; index < delayedExecutions; index++) { + promises.push(throttled()); + } + + t.is(throttled.queueSize, delayedExecutions); await Promise.all(promises);