Skip to content
霞露小伙 — HfWang
On this page

useLockFn

用于给一个异步函数增加竞态锁,防止并发执行

TIP

不建议使用这个 hooks,对于接口请求来说,如果使用的时 axios,那么可以使用 axios 的请求拦截进行拦截,或者使用 ahooks 的 useRequest,除了极少部分的场景外,这种防止并发操作的方式还有很多

武功秘籍

ts
import { useRef, useCallback } from 'react';

function useLockFn<P extends any[] = any[], V extends any = any>(
	fn: (...args: P) => Promise<V>
) {
	// 加锁的标识
	const lockRef = useRef(false);

	return useCallback(
		async (...args: P) => {
			// 如果被锁,直接 return
			if (lockRef.current) return;
			// 若处于未被锁住的状态,则设置为被锁住状态
			lockRef.current = true;

			// 让后执行相关操作,无论操作成功还是失败,在执行操作后都解锁
			try {
				const ret = await fn(...args);
				lockRef.current = false;
				return ret;
			} catch (e) {
				lockRef.current = false;
				throw e;
			}
		},
		[fn]
	);
}

export default useLockFn;

使用

直接参考官网就行

jsx
const submit = useLockFn(async () => {
	message.info('Start to submit');
	await mockApiRequest();
	setCount(val => val + 1);
	message.success('Submit finished');
});

本站中引用到的其他资料,如有侵权,请联系本人删除