diff --git a/web/src/pages/settings/prompt-preferences-pane.tsx b/web/src/pages/settings/prompt-preferences-pane.tsx
index ed0fc43b3..11d5077b4 100644
--- a/web/src/pages/settings/prompt-preferences-pane.tsx
+++ b/web/src/pages/settings/prompt-preferences-pane.tsx
@@ -1,6 +1,6 @@
import { Alert, App, Button, Input, Segmented, Select, Skeleton, Tabs, Tag } from "antd";
import { RotateCcw, Save, ShieldCheck, Undo2 } from "lucide-react";
-import { useEffect, useMemo, useState } from "react";
+import { useEffect, useMemo, useRef, useState } from "react";
import { PromptCodeEditor } from "@/components/prompt/prompt-code-editor";
import {
@@ -28,17 +28,27 @@ export function PromptPreferencesPane() {
const [rewriteContent, setRewriteContent] = useState("");
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
+ const [loadError, setLoadError] = useState("");
+ const requestIdRef = useRef(0);
const reload = async (preferredOperation?: string) => {
+ const reqId = ++requestIdRef.current;
setLoading(true);
+ setLoadError("");
try {
const result = await listUserPromptPreferences();
+ if (reqId !== requestIdRef.current) return;
setPreferences(result.preferences);
setSelectedOperation((current) => preferredOperation || current || result.preferences[0]?.definition.operation || "");
} catch (error) {
- message.error(error instanceof Error ? error.message : "读取提示词偏好失败");
+ if (reqId !== requestIdRef.current) return;
+ const msg = error instanceof Error ? error.message : "读取提示词偏好失败";
+ setLoadError(msg);
+ message.error(msg);
} finally {
- setLoading(false);
+ if (reqId === requestIdRef.current) {
+ setLoading(false);
+ }
}
};
@@ -123,6 +133,14 @@ export function PromptPreferencesPane() {
};
if (loading && preferences.length === 0) return