[ISSUE-0039] 任务控制按钮失败无反馈¶
自查发现(错误传播家族扫描)。 与 [[0036-create-task-toast-ok-but-not-listed|0036-创建任务-toast成功但任务未入列表]] 同源 — 用户主动操作的 sendMessage 静默吞错。
现象(潜在)¶
用户点任务的: - 暂停 / 继续 - 停止 - 删除 - 重命名
任一操作,如果 background task-control handler throw(如 batch 内部错误、storage 配额满),task-view.tsx:control() 的:
// v0.10.57 之前 ❌
const control = (taskId: string, action: string, payload?: any) => {
browser.runtime
.sendMessage({ type: 'task-control', taskId, action, payload })
.catch(() => {}); // ❌ 吞错 — 用户毫不知情
};
→ 用户看到的现象:点了按钮没反应,但 UI 状态可能已乐观更新(如 chip 变"已暂停")→ UI 与实际后台状态不一致。
与 ISSUE-0036 同根¶
| ISSUE | 同款位置 |
|---|---|
| 0036 | createTask sendMessage .catch(() => {}) |
| 0039 | task-control sendMessage .catch(() => {}) |
统一模式:用户主动操作的 sendMessage 必须给用户失败反馈。
修复¶
1. 前端 control() 加 then + catch 反馈¶
const control = (taskId: string, action: string, payload?: any) => {
const actionLabel: Record<string, string> = {
pause: '暂停', resume: '继续', stop: '停止', delete: '删除', rename: '重命名',
};
const label = actionLabel[action] || action;
browser.runtime
.sendMessage({ type: 'task-control', taskId, action, payload })
.then((r: any) => {
if (r && r.success === false) {
notice.error(`${label}失败:${r.message || '未知错误'}`);
}
})
.catch((e: any) => {
notice.error(`${label}失败:${e?.message || '消息发送失败(SW 可能未启动)'}`);
});
};
2. background handler try-catch¶
if (type === 'task-control') {
try {
await controlTask(message.taskId, message.action, message.payload);
return { success: true };
} catch (e: any) {
console.error('[bg] task-control failed:', e);
return { success: false, message: e?.message || '任务控制失败...' };
}
}
改动文件¶
| 文件 | 改了什么 |
|---|---|
src/sections/task/task-view.tsx |
control() 加 .then/.catch 错误反馈 |
src/entrypoints/background/index.ts |
task-control handler try-catch return success/error |
package.json |
0.10.56 → 0.10.57 |
验证¶
- ✅
pnpm compile0 错 - ✅
pnpm build8.84s - 📋 实测:触发 task-control 失败(如手动 throw 在 controlTask 内部)→ 应弹 toast "暂停失败:..."
audit_grep 防同款¶
audit_grep:
- pattern: "sendMessage\\([\\s\\S]{0,200}'task-control'[\\s\\S]{0,200}\\)\\s*\\.\\s*catch\\(\\(\\)\\s*=>\\s*\\{\\}\\)"
元-观察:错误传播家族第 5 个(自查发现)¶
ISSUE-0034 unhandledrejection 未 preventDefault ← 用户截图
ISSUE-0035 storage API 混用 silent ← 用户截图
ISSUE-0036 writeChain 吞错 (createTask) ← 用户截图
ISSUE-0037 API catch 吞错 (locations) ← 用户截图
ISSUE-0038 overflow:auto 双轴吃滚轮 ← 用户截图(布局 family,不同家族)
ISSUE-0039 task-control 吞错 (本 issue) ← 自查发现 ✅
4 + 1:错误传播家族 4 个(0034/0035/0036/0037 + 本 0039)+ 布局家族 1 个(0038)。
第 5 轮 agent 宣布 convergence 后,用户实测 + 自查发现的 6 个 bug,5 个属于"静默吞错"反模式。说明这套反模式在项目里系统性存在,仅修单点不够。
仍待办(自查同款扫描结果)¶
剩余 ~15 处 sendMessage(...).catch(() => {}),分两类:
| 类型 | 例 | 是否真 bug |
|---|---|---|
| fire-and-forget 通知(不需用户反馈) | sendMessage({type: 'settings-changed'}) |
🟢 可接受 |
| 用户主动操作(必须反馈) | 任何用户点的按钮 | 🔴 应改 |
下次 todo:grep 所有用户主动操作按钮的 sendMessage,逐个加反馈。