@td-design/rn-hooks
Version:
从ahooks里面抽取的一些在rn项目里可以使用的hooks。提高开发效率
44 lines (41 loc) • 1.66 kB
JavaScript
import { __awaiter, __generator, __spreadArray, __read } from '../_virtual/_tslib.js';
import { useRef, useCallback } from 'react';
/**
* 用于给一个异步函数增加竞态锁,防止并发执行。
* 可以用在诸如表单提交的场景下,保证即便多次点击提交,在前一次结果未完成之前,后续操作会被忽略
*/
function useLockFn(fn) {
var _this = this;
var lockRef = useRef(false);
return useCallback(function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(_this, void 0, void 0, function () {
var result, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (lockRef.current)
return [2 /*return*/];
lockRef.current = true;
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, fn.apply(void 0, __spreadArray([], __read(args), false))];
case 2:
result = _a.sent();
lockRef.current = false;
return [2 /*return*/, result];
case 3:
error_1 = _a.sent();
lockRef.current = false;
throw error_1;
case 4: return [2 /*return*/];
}
});
});
}, [fn]);
}
export { useLockFn as default };