运维管理平台前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

71 lines
1.8 KiB

import { ref, watch } from 'vue';
import type { UseRequestPlugin, UseRequestTimeout } from '../types';
import { isDocumentVisible } from '../utils/isDocumentVisible';
import subscribeReVisible from '../utils/subscribeReVisible';
const usePollingPlugin: UseRequestPlugin<any, any[]> = (
fetchInstance,
{ pollingInterval, pollingWhenHidden = true, pollingErrorRetryCount = -1 },
) => {
const timerRef = ref<UseRequestTimeout>();
const unsubscribeRef = ref<() => void>();
const countRef = ref<number>(0);
const stopPolling = () => {
if (timerRef.value) {
clearTimeout(timerRef.value);
}
unsubscribeRef.value?.();
};
watch(
() => pollingInterval,
() => {
if (!pollingInterval) {
stopPolling();
}
},
);
if (!pollingInterval) {
return {};
}
return {
onBefore: () => {
stopPolling();
},
onError: () => {
countRef.value += 1;
},
onSuccess: () => {
countRef.value = 0;
},
onFinally: () => {
if (
pollingErrorRetryCount === -1 ||
// When an error occurs, the request is not repeated after pollingErrorRetryCount retries
(pollingErrorRetryCount !== -1 && countRef.value <= pollingErrorRetryCount)
) {
timerRef.value = setTimeout(() => {
// if pollingWhenHidden = false && document is hidden, then stop polling and subscribe revisible
if (!pollingWhenHidden && !isDocumentVisible()) {
unsubscribeRef.value = subscribeReVisible(() => {
fetchInstance.refresh();
});
} else {
fetchInstance.refresh();
}
}, pollingInterval);
} else {
countRef.value = 0;
}
},
onCancel: () => {
stopPolling();
},
};
};
export default usePollingPlugin;