@gdjiami/hooks
Version:
react hooks for mygzb.com
107 lines (106 loc) • 4.86 kB
JavaScript
;
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;