From 2b7b1835e99cf0da5a1df3629009cc0ef21cfec4 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 16 Jun 2026 17:06:17 +0300 Subject: [PATCH] cleaner promise_interval --- .../promise_interval/promise_interval.js | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/services/promise_interval/promise_interval.js b/src/services/promise_interval/promise_interval.js index 46ac68996..c77768b4f 100644 --- a/src/services/promise_interval/promise_interval.js +++ b/src/services/promise_interval/promise_interval.js @@ -4,32 +4,38 @@ // time after the first interval. // - interval is the interval delay in ms. +const wait = (timeout) => { + let timeoutId + const promise = () => new Promise((resolve) => { + timeoutId = window.setTimeout(() => resolve(), timeout) + }) + return { timeoutId, promise } +} + export const promiseInterval = (promiseCall, interval) => { let stopped = false let timeout = null - const func = () => { - const promise = promiseCall() - // something unexpected happened and promiseCall did not - // return a promise, abort the loop. - if (!(promise && promise.finally)) { - console.warn( - 'promiseInterval: promise call did not return a promise, stopping interval.', - ) - return - } - promise.finally(() => { - if (stopped) return - timeout = window.setTimeout(func, interval) - }) - } - const stopFetcher = () => { stopped = true window.clearTimeout(timeout) } - timeout = window.setTimeout(func, interval) + const loop = new Promise(async (resolve, reject) => { + try { + while (!stopped) { + await promiseCall() + const { timeoutId, promise } = wait(interval) + timeout = timeoutId + await promise() + } + resolve() + } catch (e) { + reject(e) + } + }) + + loop.then() return { stop: stopFetcher } }