1 | var _ = require("./_");
|
2 | var sleep = require("./sleep");
|
3 | var $retryError = {};
|
4 |
|
5 | module.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 | };
|