refactor: 推理对比超时与打字机展示改进

抽取 withTimeout 替代 Promise.race 超时控制,对比结果新增打字机逐字渲染与清理,推理聊天参数与列表类型同步收敛。
This commit is contained in:
caoxiaozhu
2026-07-16 11:03:25 +08:00
parent 5a040366da
commit ab9e87f948
4 changed files with 83 additions and 42 deletions

View File

@@ -3,6 +3,7 @@ import { ref, onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import DataTablePage from '@/components/DataTablePage.vue'
import { usePolling } from '@/composables/usePolling'
import {
getCompareList,
deleteCompare,
@@ -17,7 +18,7 @@ const router = useRouter()
const loading = ref(false)
const dataList = ref<CompareTask[]>([])
let refreshTimer: ReturnType<typeof setInterval> | null = null
let delayedRefreshTimer: ReturnType<typeof setTimeout> | null = null
async function loadData(silent = false) {
if (!silent) {
@@ -80,7 +81,8 @@ function parseModelNames(row: any): string[] {
async function handleLoad(row: any) {
await loadCompare(row.id)
ElMessage.info('正在加载模型,请稍候...')
setTimeout(loadData, 1000)
if (delayedRefreshTimer) clearTimeout(delayedRefreshTimer)
delayedRefreshTimer = setTimeout(loadData, 1000)
}
/** 卸载推理任务 */
@@ -112,13 +114,15 @@ function startChat(row: any) {
router.push(`/model-inference/chat/${row.id}`)
}
onMounted(() => {
loadData()
refreshTimer = setInterval(() => loadData(true), 3000)
const { start: startPolling } = usePolling(() => loadData(true), 3000, { immediate: false })
onMounted(async () => {
await loadData()
startPolling()
})
onUnmounted(() => {
if (refreshTimer) clearInterval(refreshTimer)
if (delayedRefreshTimer) clearTimeout(delayedRefreshTimer)
})
</script>