redo-promise
Version:
Retry a promise, when async function call.
55 lines (46 loc) • 1.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
/**
* 重试 Promise
* @param requestPromise
* @param predicate
* @param opts
* @returns {function(...[*]=): Promise<any>}
*/
var retry = function retry(requestPromise) {
var predicate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return false;
};
var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _opts$delay = opts.delay,
delay = _opts$delay === undefined ? 1000 : _opts$delay,
_opts$max = opts.max,
max = _opts$max === undefined ? 5 : _opts$max,
_opts$cnt = opts.cnt,
cnt = _opts$cnt === undefined ? 0 : _opts$cnt;
return function () {
for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {
params[_key] = arguments[_key];
}
return new Promise(function (resolve, reject) {
requestPromise.apply(undefined, params).then(function (result) {
// 判断重试条件
if (cnt < max && predicate(result)) {
// 重试
var f = retry(requestPromise, predicate, _extends({}, opts, {
cnt: cnt + 1
}));
return setTimeout(function () {
f.apply(undefined, params).then(resolve).catch(reject);
}, delay);
}
// 不用重试了
resolve(result);
}).catch(reject);
});
};
};
exports.default = retry;