Adds backoff algo from EE to CE
This commit is contained in:
parent
a0da03d95c
commit
3ecca3b039
1 changed files with 52 additions and 0 deletions
|
@ -296,5 +296,57 @@
|
||||||
* @returns {Boolean}
|
* @returns {Boolean}
|
||||||
*/
|
*/
|
||||||
w.gl.utils.convertPermissionToBoolean = permission => permission === 'true';
|
w.gl.utils.convertPermissionToBoolean = permission => permission === 'true';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Back Off exponential algorithm
|
||||||
|
* backOff :: (Function<next, stop>, Number) -> Promise<Any, Error>
|
||||||
|
*
|
||||||
|
* @param {Function<next, stop>} fn function to be called
|
||||||
|
* @param {Number} timeout
|
||||||
|
* @return {Promise<Any, Error>}
|
||||||
|
* @example
|
||||||
|
* ```
|
||||||
|
* backOff(function (next, stop) {
|
||||||
|
* // Let's perform this function repeatedly for 60s or for the timeout provided.
|
||||||
|
*
|
||||||
|
* ourFunction()
|
||||||
|
* .then(function (result) {
|
||||||
|
* // continue if result is not what we need
|
||||||
|
* next();
|
||||||
|
*
|
||||||
|
* // when result is what we need let's stop with the repetions and jump out of the cycle
|
||||||
|
* stop(result);
|
||||||
|
* })
|
||||||
|
* .catch(function (error) {
|
||||||
|
* // if there is an error, we need to stop this with an error.
|
||||||
|
* stop(error);
|
||||||
|
* })
|
||||||
|
* }, 60000)
|
||||||
|
* .then(function (result) {})
|
||||||
|
* .catch(function (error) {
|
||||||
|
* // deal with errors passed to stop()
|
||||||
|
* })
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
w.gl.utils.backOff = (fn, timeout = 60000) => {
|
||||||
|
let nextInterval = 2000;
|
||||||
|
|
||||||
|
const startTime = (+new Date());
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const stop = arg => ((arg instanceof Error) ? reject(arg) : resolve(arg));
|
||||||
|
|
||||||
|
const next = () => {
|
||||||
|
if (new Date().getTime() - startTime < timeout) {
|
||||||
|
setTimeout(fn.bind(null, next, stop), nextInterval);
|
||||||
|
nextInterval *= 2;
|
||||||
|
} else {
|
||||||
|
reject(new Error('BACKOFF_TIMEOUT'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fn(next, stop);
|
||||||
|
});
|
||||||
|
};
|
||||||
})(window);
|
})(window);
|
||||||
}).call(window);
|
}).call(window);
|
||||||
|
|
Loading…
Reference in a new issue