41 lines
888 B
TypeScript
41 lines
888 B
TypeScript
import { useEffect, useRef } from 'react';
|
||
|
||
export function useAbortController() {
|
||
const controllerRef = useRef<AbortController | null>(null);
|
||
|
||
// 获取AbortSignal实例
|
||
const getSignal = () => {
|
||
if (!controllerRef.current) {
|
||
controllerRef.current = new AbortController();
|
||
}
|
||
return controllerRef.current.signal;
|
||
};
|
||
|
||
// 中止所有请求
|
||
const abortAll = () => {
|
||
if (controllerRef.current) {
|
||
controllerRef.current.abort();
|
||
controllerRef.current = null;
|
||
}
|
||
};
|
||
|
||
// 创建新的Controller,并中止之前的请求
|
||
const recreate = () => {
|
||
abortAll();
|
||
controllerRef.current = new AbortController();
|
||
return controllerRef.current.signal;
|
||
};
|
||
|
||
// 组件卸载时自动中止所有请求
|
||
useEffect(() => {
|
||
return () => {
|
||
abortAll();
|
||
};
|
||
}, []);
|
||
|
||
return {
|
||
getSignal,
|
||
abortAll,
|
||
recreate
|
||
};
|
||
}
|