bbo
Version:
bbo is a utility library of zero dependencies for javascript.
50 lines (41 loc) • 1.1 kB
JavaScript
;
/* eslint-disable prefer-promise-reject-errors */
/**
* @param {any} attempt
* @param {any} options
* interval: 200, //ms
* retries: 2
* timeout: 8000 //ms
*/
function retry (attempt, options) {
var option = options || {};
var interval = option.interval || 400;
var retries = option.retries || 2;
var timeout = option.timeout || 8000;
function rejectDelay(reason) {
return new Promise(function (resolve, reject) {
setTimeout(reject.bind(null, reason), interval);
});
}
var p = Promise.reject();
for (var i = 0; i < retries; i++) {
p = p.catch(timeoutReject(attempt, timeout)).catch(rejectDelay);
}
return p;
}
function timeoutReject(task, timeout) {
var timer;
return function () {
return Promise.race([Promise.reject().catch(task), new Promise(function (rs, rj) {
timer = setTimeout(function () {
rj('timeout.');
}, timeout || 8000);
})]).then(function (r) {
clearTimeout(timer);
return r;
}, function (err) {
return Promise.reject(err);
});
};
}
module.exports = retry;