vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
89 lines (88 loc) • 3.16 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.LoopUntilRetryLimitExceededError = void 0;
exports.loopUntil = loopUntil;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
var _lodashUni = require("lodash-uni");
var _wait = require("./wait");
var LoopUntilRetryLimitExceededError = exports.LoopUntilRetryLimitExceededError = /*#__PURE__*/function (_Error) {
(0, _inheritsLoose2.default)(LoopUntilRetryLimitExceededError, _Error);
function LoopUntilRetryLimitExceededError() {
return _Error.apply(this, arguments) || this;
}
return LoopUntilRetryLimitExceededError;
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
/**
* 循环调用某个函数直至达到某个条件后返回调用结果。
*
* @param fn 要调用的函数
* @param condition 条件
* @param options 选项
*/
function loopUntil(_x, _x2, _x3) {
return _loopUntil.apply(this, arguments);
}
function _loopUntil() {
_loopUntil = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(fn, condition, options) {
var retryCount, _res;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (options == null) {
options = condition;
condition = fn;
fn = undefined;
}
retryCount = 0; // eslint-disable-next-line no-constant-condition
case 2:
if (!true) {
_context.next = 22;
break;
}
if (!fn) {
_context.next = 9;
break;
}
_context.next = 6;
return fn();
case 6:
_context.t0 = _context.sent;
_context.next = 10;
break;
case 9:
_context.t0 = undefined;
case 10:
_res = _context.t0;
_context.next = 13;
return condition(_res);
case 13:
if (!_context.sent) {
_context.next = 15;
break;
}
return _context.abrupt("return", _res);
case 15:
if (!(options.retryLimit && retryCount >= options.retryLimit)) {
_context.next = 17;
break;
}
throw new LoopUntilRetryLimitExceededError('已达到最大重试次数');
case 17:
retryCount++;
_context.next = 20;
return (0, _wait.wait)(typeof options.retryDelay === 'number' ? options.retryDelay : (0, _lodashUni.sample)(options.retryDelay));
case 20:
_context.next = 2;
break;
case 22:
case "end":
return _context.stop();
}
}, _callee);
}));
return _loopUntil.apply(this, arguments);
}
;