diff options
| author | Alex Yatskov <alex@foosoft.net> | 2019-11-05 19:04:13 -0800 | 
|---|---|---|
| committer | Alex Yatskov <alex@foosoft.net> | 2019-11-05 19:04:13 -0800 | 
| commit | 08ad2779678cd447bd747c2b155ef9b5135fdf5d (patch) | |
| tree | faa54cbf9176989f9bd3c3b90ff3e032189adb20 /ext/mixed/js/extension.js | |
| parent | 438498435227cfa59cf9ed3430045b288cd2a7c0 (diff) | |
| parent | 91c01e0a7eeeb851344a22ace8a5fa0b873a3e57 (diff) | |
Merge branch 'master' into testing
Diffstat (limited to 'ext/mixed/js/extension.js')
| -rw-r--r-- | ext/mixed/js/extension.js | 38 | 
1 files changed, 38 insertions, 0 deletions
diff --git a/ext/mixed/js/extension.js b/ext/mixed/js/extension.js index 861e52a5..54862e19 100644 --- a/ext/mixed/js/extension.js +++ b/ext/mixed/js/extension.js @@ -95,3 +95,41 @@ if (EXTENSION_IS_BROWSER_EDGE) {      // Edge does not have chrome defined.      chrome = browser;  } + +function promiseTimeout(delay, resolveValue) { +    if (delay <= 0) { +        return Promise.resolve(resolveValue); +    } + +    let timer = null; +    let promiseResolve = null; +    let promiseReject = null; + +    const complete = (callback, value) => { +        if (callback === null) { return; } +        if (timer !== null) { +            window.clearTimeout(timer); +            timer = null; +        } +        promiseResolve = null; +        promiseReject = null; +        callback(value); +    }; + +    const resolve = (value) => complete(promiseResolve, value); +    const reject = (value) => complete(promiseReject, value); + +    const promise = new Promise((resolve, reject) => { +        promiseResolve = resolve; +        promiseReject = reject; +    }); +    timer = window.setTimeout(() => { +        timer = null; +        resolve(resolveValue); +    }, delay); + +    promise.resolve = resolve; +    promise.reject = reject; + +    return promise; +}  |