usePolling 封装
import { useRef, useCallback } from 'react';
interface ICallback {
(): Promise<boolean>;
}
function usePolling(callback: ICallback, delay: number) {
const timer = useRef<number>();
const stopPolling = useCallback(() => clearTimeout(timer.current), [
callback,
delay,
]);
const startPolling = useCallback(() => {
stopPolling();
const tick = async () => {
if (await callback()) {
startPolling();
}
};
timer.current = window.setTimeout(tick, delay);
}, [callback, delay]);
return {
startPolling,
stopPolling,
};
}
export default usePolling;
debounce 封装
- 某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。
import { useRef, useCallback } from 'react';
import debounce from 'lodash.debounce';
type Fn = (...args: any[]) => any;
const useDebounce = <T extends Fn>(fn: T, ms: number): T => {
const fRef = useRef<Fn>();
fRef.current = fn;
const result = useCallback(
debounce((...args) => {
fRef.current && fRef.current(...args);
}, ms),
[],
);
return result;
};
export default useDebounce;