UNPKG

@gdjiami/hooks

Version:

react hooks for mygzb.com

107 lines (106 loc) 4.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = require("react"); var useRefProps_1 = tslib_1.__importDefault(require("./useRefProps")); var useRefState_1 = tslib_1.__importDefault(require("./useRefState")); var useOnUnmount_1 = tslib_1.__importDefault(require("./useOnUnmount")); var useInstance_1 = tslib_1.__importDefault(require("./useInstance")); var useOnUpdate_1 = require("./useOnUpdate"); /** * 实现页面轮询机制 */ function usePoll(options) { var _this = this; var _a = tslib_1.__read(useRefState_1.default(false), 3), polling = _a[0], setPolling = _a[1], pollingRef = _a[2]; var _b = tslib_1.__read(react_1.useState(), 2), error = _b[0], setError = _b[1]; var _c = tslib_1.__read(useInstance_1.default({}), 1), state = _c[0]; var optionsRef = useRefProps_1.default(options); var poll = react_1.useCallback(function (immediate) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var _this = this; return tslib_1.__generator(this, function (_a) { /** * 已经卸载,或其他轮询器正在轮询 */ if (state.unmounted || pollingRef.current) { return [2 /*return*/]; } setPolling(true); state.timer = window.setTimeout(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var res, error_1, err_1, _a; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: if (state.unmounted) { return [2 /*return*/]; } _b.label = 1; case 1: _b.trys.push([1, , 8, 9]); res = void 0; setError(undefined); _b.label = 2; case 2: _b.trys.push([2, 4, , 5]); return [4 /*yield*/, optionsRef.current.poller()]; case 3: res = _b.sent(); return [3 /*break*/, 5]; case 4: err_1 = _b.sent(); console.warn("[usePoll] poll error", err_1); error_1 = err_1; setError(err_1); if (optionsRef.current.onError) { optionsRef.current.onError(err_1); } if (!optionsRef.current.ignoreError) { return [2 /*return*/]; } return [3 /*break*/, 5]; case 5: _a = !state.unmounted; if (!_a) return [3 /*break*/, 7]; return [4 /*yield*/, optionsRef.current.condition(res, error_1)]; case 6: _a = (_b.sent()); _b.label = 7; case 7: if (_a) { setTimeout(poll); } return [3 /*break*/, 9]; case 8: !state.unmounted && setPolling(false); return [7 /*endfinally*/]; case 9: return [2 /*return*/]; } }); }); }, immediate ? 0 : optionsRef.current.duration || 5000); return [2 /*return*/]; }); }); }, []); useOnUpdate_1.useOnUpdate(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (pollingRef.current) { return [2 /*return*/]; } return [4 /*yield*/, optionsRef.current.condition()]; case 1: // setup if (_a.sent()) { poll(options.immediately); } return [2 /*return*/]; } }); }); }, options.args || [], false); useOnUnmount_1.default(function () { window.clearTimeout(state.timer); state.unmounted = true; }); return { polling: polling, error: error }; } exports.default = usePoll;