fix: 补齐其余 3 处任务轮询的服务断开容错

此前只有榜单更新一处做了处理(连续 3 次查询失败即提示并结束轮询)。
其余 3 处——app.js executeTask(通用 AI 任务)、data-pages 批量更新账号、视频解析——仍是 catch 后 continue,
服务被回收时会静默空转 15~35 分钟到超时,用户只看到按钮转圈。
现 4 处轮询口径统一。
This commit is contained in:
maogeigei committed 2026-10-08 17:22:30 +08:00
1 parent a3ca08eabd
commit 1f7d695afd
2 files changed
+17 -3

No files matched your search

@@ -80,9 +80,19 @@ async function executeTask(opts) {
}
// 轮询任务状态直到完成(最长 30 分钟,账号提炼等任务耗时较长)
const deadline = Date.now() + 30 * 60 * 1000;
let pollFail = 0; // 10-08:服务断开时 api() 持续抛错,连续 3 次即提示并结束,避免静默空转到超时
while (Date.now() < deadline) {
await new Promise((r) => setTimeout(r, 5000));
try { s = await api('/api/run/status?id=' + encodeURIComponent(taskId)); } catch (e) { continue; }
try { s = await api('/api/run/status?id=' + encodeURIComponent(taskId)); pollFail = 0; }
catch (e) {
if (++pollFail >= 3) {
restore();
TaskProgress.hide();
showToast('⚠️ 工作台服务已断开(连续 3 次查询失败);任务仍在后台执行,重启工作台后可继续查看');
return;
}
continue;
}
if (s) TaskProgress.update(s, opts.label || '工作台任务');
if (!s || s.state === 'notfound') { finished = true; finish(s || null); break; }
if (s.state === 'done') { finished = true; finish(s); showToast('✅ 任务执行完成,页面已自动刷新'); refreshCurrentPage(); break; }
@@ -1231,12 +1231,14 @@ function updateFollowedAccounts(btn) {
const taskId = r.id;
const taskTitle = '更新账号·' + name;
TaskProgress.show(taskTitle);
let pollFail = 0; // 10-08:服务断开时连续 3 次查询失败即提示,避免静默空转
const deadline = Date.now() + 20 * 60 * 1000;
let state = 'running';
while (Date.now() < deadline) {
await new Promise((res) => setTimeout(res, 5000));
let s = null;
try { s = await api('/api/run/status?id=' + encodeURIComponent(taskId)); } catch (e) { continue; }
try { s = await api('/api/run/status?id=' + encodeURIComponent(taskId)); pollFail = 0; }
catch (e) { if (++pollFail >= 3) { restore(); TaskProgress.hide(); showToast('⚠️ 工作台服务已断开(连续 3 次查询失败);任务仍在后台执行'); return; } continue; }
if (s) TaskProgress.update(s, taskTitle);
if (!s || s.state === 'notfound') { state = 'done'; break; }
if (s.state === 'done') { state = 'done'; break; }
@@ -1968,10 +1970,12 @@ function readVideoTaskRec(videoId) {
async function watchVideoParseTask(videoId, taskId, reload) {
let s = null;
TaskProgress.show('视频解析');
let pollFail = 0; // 10-08:服务断开时连续 3 次查询失败即提示,避免静默空转
const deadline = Date.now() + 35 * 60 * 1000;
while (Date.now() < deadline) {
await new Promise((r) => setTimeout(r, 5000));
try { s = await api('/api/run/status?id=' + encodeURIComponent(taskId)); } catch (e) { continue; }
try { s = await api('/api/run/status?id=' + encodeURIComponent(taskId)); pollFail = 0; }
catch (e) { if (++pollFail >= 3) { TaskProgress.hide(); showToast('⚠️ 工作台服务已断开(连续 3 次查询失败);任务仍在后台执行'); return; } continue; }
if (s) TaskProgress.update(s, '视频解析');
if (!s || s.state === 'notfound' || s.state === 'done' || s.state === 'error' || s.state === 'review') break;
}