UNPKG

ht_hooks

Version:
76 lines (74 loc) 3.37 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = require("react"); var _useUpdateEffect = _interopRequireDefault(require("../../../useUpdateEffect")); var _isDocumentVisible = _interopRequireDefault(require("../utils/isDocumentVisible")); var _subscribeReVisible = _interopRequireDefault(require("../utils/subscribeReVisible")); //!在请求成功或失败之后,隔一段时间自动重新请求,形成“循环请求” //!每隔 pollingInterval 毫秒重新请求一次 //!根据 pollingWhenHidden 判断 //!如果连续出错次数超过 pollingErrorRetryCount,停止轮询 //!页面恢复可见后,立刻再发请求 var usePollingPlugin = function usePollingPlugin(fetchInstance, _a) { var pollingInterval = _a.pollingInterval, _b = _a.pollingWhenHidden, pollingWhenHidden = _b === void 0 ? true : _b, _c = _a.pollingErrorRetryCount, pollingErrorRetryCount = _c === void 0 ? -1 : _c; var timerRef = (0, _react.useRef)(); //存储轮询定时器 var unsubscribeRef = (0, _react.useRef)(); //用于取消可见性恢复订阅 var countRef = (0, _react.useRef)(0); //记录连续错误的次数 var stopPolling = function stopPolling() { var _a; if (timerRef.current) { clearTimeout(timerRef.current); //清除当前轮询定时器 } (_a = unsubscribeRef.current) === null || _a === void 0 ? void 0 : _a.call(unsubscribeRef); //清理“页面可见性恢复”的订阅 }; (0, _useUpdateEffect["default"])(function () { if (!pollingInterval) { stopPolling(); //如果 pollingInterval 为 0 或 undefined,停止轮询 } }, [pollingInterval]); if (!pollingInterval) { //#如果没配置 pollingInterval,插件啥也不干 return {}; } return { onBefore: function onBefore() { stopPolling(); //每次请求前先停掉上一轮的轮询,避免多次定时器叠加 }, onError: function onError() { countRef.current += 1; //如果请求出错,错误计数加 1 }, onSuccess: function onSuccess() { countRef.current = 0; //如果请求成功,错误计数清零 }, onFinally: function onFinally() { if ( //如果 允许错误次数 是无限次,或者有限次但还没超限,就继续重新请求 pollingErrorRetryCount === -1 || pollingErrorRetryCount !== -1 && countRef.current <= pollingErrorRetryCount) { timerRef.current = setTimeout(function () { if (!pollingWhenHidden && !(0, _isDocumentVisible["default"])()) { //如果页面不可见 (document.hidden) 且不允许隐藏时暂停轮询 unsubscribeRef.current = (0, _subscribeReVisible["default"])(function () { fetchInstance.refresh(); //页面恢复可见时refresh重新请求(又会触发onFinally轮询) }); } else { fetchInstance.refresh(); } }, pollingInterval); } else { countRef.current = 0; //!超过最大错误次数时:不设置下一个定时器(没有 setTimeout),相当于彻底停掉了轮询 } }, onCancel: function onCancel() { stopPolling(); } }; }; var _default = exports["default"] = usePollingPlugin;