| 123456789101112131415161718192021222324252627282930313233343536 |
- var _ = require("./_");
- var sleep = require("./sleep");
- var $retryError = {};
- module.exports = function (initRetries, span, fn, self) {
- return function () {
- var retries = initRetries;
- var errs = [], args = arguments;
- if (_.isFunction(span)) {
- self = fn;
- fn = span;
- span = 0;
- }
- var countdown = _.isFunction(retries) ?
- retries : function () { return sleep(span, retries--); };
- function tryFn (isContinue) {
- return isContinue ? fn.apply(self, args) : _.Promise.reject($retryError);
- }
- function onError (err) {
- if (err === $retryError) return _.Promise.reject(errs);
- errs.push(err);
- return attempt();
- }
- function attempt () {
- return _.Promise.resolve(countdown(errs)).then(tryFn).catch(onError);
- }
- return attempt();
- };
- };
|