UNPKG

945 BJavaScriptView Raw
1var _ = require("./_");
2var sleep = require("./sleep");
3var $retryError = {};
4
5module.exports = function (initRetries, span, fn, self) {
6 return function () {
7 var retries = initRetries;
8 var errs = [], args = arguments;
9
10 if (_.isFunction(span)) {
11 self = fn;
12 fn = span;
13 span = 0;
14 }
15
16 var countdown = _.isFunction(retries) ?
17 retries : function () { return sleep(span, --retries); };
18
19 function tryFn (isContinue) {
20 return isContinue ? fn.apply(self, args) : _.Promise.reject($retryError);
21 }
22
23 function onError (err) {
24 if (err === $retryError) return _.Promise.reject(errs);
25
26 errs.push(err);
27 return attempt(countdown(errs));
28 }
29
30 function attempt (c) {
31 return _.Promise.resolve(c).then(tryFn)["catch"](onError);
32 }
33
34 return attempt(true);
35 };
36};