diff options
Diffstat (limited to 'ext/mixed')
-rw-r--r-- | ext/mixed/js/core.js | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index 5bee4670..c5c6fef2 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -258,6 +258,34 @@ function promiseTimeout(delay, resolveValue) { return promise; } +function promiseAnimationFrame(timeout=null) { + return new Promise((resolve) => { + let timer = null; + let frameRequest = null; + const onFrame = (time) => { + frameRequest = null; + if (timer !== null) { + clearTimeout(timer); + timer = null; + } + resolve({time, timeout: false}); + }; + const onTimeout = () => { + timer = null; + if (frameRequest !== null) { + cancelAnimationFrame(frameRequest); + frameRequest = null; + } + resolve({time: timeout, timeout: true}); + }; + + frameRequest = requestAnimationFrame(onFrame); + if (typeof timeout === 'number') { + timer = setTimeout(onTimeout, timeout); + } + }); +} + /* * Common classes |