Skip to content

Commit

Permalink
Fixed retry method to catch sync errors;
Browse files Browse the repository at this point in the history
Added `scopeArg` option for `retry` method;
  • Loading branch information
DigitalBrainJS committed May 24, 2021
1 parent 5bfa633 commit 14ddfb8
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 17 deletions.
17 changes: 9 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1724,14 +1724,15 @@ Retry async operation

**Kind**: static method of [<code>CPromise</code>](#module_CPromise..CPromise)

| Param | Type |
| --- | --- |
| fn | <code>CPGeneratorRetryFunction</code> \| <code>CPRetryFunction</code> |
| [options] | <code>object</code> |
| [options.args] | <code>array</code> |
| [options.retries] | <code>number</code> |
| [options.delayWeight] | <code>number</code> \| <code>CPRetryDelayResolver</code> |
| [options.delay] | <code>object</code> |
| Param | Type | Default |
| --- | --- | --- |
| fn | <code>CPGeneratorRetryFunction</code> \| <code>CPRetryFunction</code> | |
| [options] | <code>Object</code> | |
| [options.args] | <code>Array</code> | |
| [options.retries] | <code>Number</code> | |
| [options.delayWeight] | <code>Number</code> | |
| [options.delay] | <code>Number</code> \| <code>CPRetryDelayResolver</code> | |
| [options.scopeArg] | <code>Boolean</code> | <code>false</code> |

<a name="module_CPromise..CPromise.resolve"></a>

Expand Down
23 changes: 14 additions & 9 deletions lib/c-promise.js
Original file line number Diff line number Diff line change
Expand Up @@ -1526,30 +1526,33 @@ const CPromise= class CPromise extends Promise {
/**
* Retry async operation
* @param {CPGeneratorRetryFunction|CPRetryFunction} fn
* @param {object} [options]
* @param {array} [options.args]
* @param {number} [options.retries]
* @param {number|CPRetryDelayResolver} [options.delayWeight]
* @param {object} [options.delay]
* @param {Object} [options]
* @param {Array} [options.args]
* @param {Number} [options.retries]
* @param {Number} [options.delayWeight]
* @param {Number|CPRetryDelayResolver} [options.delay]
* @param {Boolean} [options.scopeArg= false]
* @return {CPromise}
*/
static retry(fn, options) {
if (typeof fn !== 'function') {
throw TypeError('fn must be a function');
}

options!==undefined && validateOptions(options, {
options !== undefined && validateOptions(options, {
args: array(),
retries: numberFinitePositive,
delayWeight: numberFinitePositive,
delay: union(numberFinitePositive, functionPlain)
delay: union(numberFinitePositive, functionPlain),
scopeArg: boolean
});

const {
args = [],
retries = 3,
delayWeight= 0.1,
delay = (attempt) => attempt * 1000
delay = (attempt) => attempt * 1000,
scopeArg= false
} = typeof options === 'number' ? {retries: options} : options || {};

let attemptIndex = 0;
Expand All @@ -1562,7 +1565,9 @@ const CPromise= class CPromise extends Promise {

const doAttempt = () => {
return isGeneratorFunction(fn) ?
this.run(fn, {args: fnArgs, scopeArg: true}) : this.resolve(fn.apply(scope, fnArgs));
this.run(fn, {args: fnArgs, scopeArg}) : new this((resolve, reject, _scope) => {
resolve(fn.apply(_scope, scopeArg ? [_scope, attemptIndex, args] : fnArgs));
})
}

let _delay = delay;
Expand Down

0 comments on commit 14ddfb8

Please sign in to comment.