UNPKG

trytryagain

Version:

Keep trying until it works. Actually a very reliable testing strategy.

91 lines (72 loc) 2.09 kB
module.exports = function(fn, options) { if (typeof options === 'function') { var opts = fn; fn = options; options = opts; } var timeout = options && options.hasOwnProperty('timeout') && options.timeout !== undefined? options.timeout: 1000; var interval = options && options.hasOwnProperty('interval') && options.interval !== undefined? options.interval: 10; var startTime = Date.now(); function waitAndLoop(error) { return wait(interval).then(function () { return retryLoop(error); }); } function retryLoop(lastError) { if (lastError && ((startTime + timeout) < Date.now())) { return Promise.reject(lastError); } var result; var error; try { result = fn(); } catch(e) { error = e; } if (result && typeof result.then === 'function') { return result.then(undefined, waitAndLoop); } else if (error) { return waitAndLoop(error); } else { return Promise.resolve(result); } } return retryLoop(); }; module.exports.ensuring = function (fn, options) { if (typeof options === 'function') { var opts = fn; fn = options; options = opts; } var duration = options && options.hasOwnProperty('duration') && options.duration !== undefined? options.duration: 1000; var interval = options && options.hasOwnProperty('interval') && options.interval !== undefined? options.interval: 10; var startTime = Date.now(); function waitAndLoop(result) { return wait(interval).then(function () { return retryLoop(result); }); } function retryLoop(lastResult) { if (((startTime + duration) < Date.now())) { return Promise.resolve(lastResult); } var result; try { result = fn(); } catch(e) { return Promise.reject(e); } if (result && typeof result.then === 'function') { return result.then(waitAndLoop); } else { return waitAndLoop(result); } } return retryLoop(); }; function wait(n) { return new Promise(function (fulfil) { setTimeout(fulfil, n); }); }