fix(下载): 优化下载重试逻辑,使用递增超时时间

将固定30秒超时改为递增超时机制(3秒/5秒/15秒)
缩短进度检查间隔至1秒,提高响应速度
This commit is contained in:
2026-03-29 12:06:10 +08:00
parent 5951bd1d35
commit 033735d476

View File

@@ -407,12 +407,14 @@ async function processNextInQueue() {
sendStatus("downloading"); sendStatus("downloading");
// 下载重试逻辑:卡在0% 30秒则重启最多3次 // 下载重试逻辑:每次超时时间递增最多3次
const maxRetries = 3; const timeoutList = [3000, 5000, 15000]; // 第一次3秒第二次5秒第三次15秒
let retryCount = 0; let retryCount = 0;
let downloadSuccess = false; let downloadSuccess = false;
while (retryCount < maxRetries && !downloadSuccess) { while (retryCount < timeoutList.length && !downloadSuccess) {
const currentTimeout = timeoutList[retryCount];
if (retryCount > 0) { if (retryCount > 0) {
sendLog(`${retryCount} 次重试下载...`); sendLog(`${retryCount} 次重试下载...`);
webContents?.send("install-progress", { id, progress: 0 }); webContents?.send("install-progress", { id, progress: 0 });
@@ -437,8 +439,7 @@ async function processNextInQueue() {
let lastProgressTime = Date.now(); let lastProgressTime = Date.now();
let lastProgress = 0; let lastProgress = 0;
const zeroProgressTimeout = 30000; // 0%卡死30秒超时 const progressCheckInterval = 1000; // 每1秒检查一次
const progressCheckInterval = 3000; // 每3秒检查一次
// 设置超时检测定时器 // 设置超时检测定时器
const timeoutChecker = setInterval(() => { const timeoutChecker = setInterval(() => {
@@ -446,12 +447,12 @@ async function processNextInQueue() {
// 只在进度为0时检查超时 // 只在进度为0时检查超时
if ( if (
lastProgress === 0 && lastProgress === 0 &&
now - lastProgressTime > zeroProgressTimeout now - lastProgressTime > currentTimeout
) { ) {
clearInterval(timeoutChecker); clearInterval(timeoutChecker);
child.kill(); child.kill();
reject( reject(
new Error(`下载卡在0%超过 ${zeroProgressTimeout / 1000}`), new Error(`下载卡在0%超过 ${currentTimeout / 1000}`),
); );
} }
}, progressCheckInterval); }, progressCheckInterval);
@@ -492,10 +493,10 @@ async function processNextInQueue() {
downloadSuccess = true; downloadSuccess = true;
} catch (err) { } catch (err) {
retryCount++; retryCount++;
if (retryCount >= maxRetries) { if (retryCount >= timeoutList.length) {
throw new Error(`下载失败,已重试 ${maxRetries} 次: ${err}`); throw new Error(`下载失败,已重试 ${timeoutList.length} 次: ${err}`);
} }
sendLog(`下载失败,准备重试 (${retryCount}/${maxRetries})`); sendLog(`下载失败,准备重试 (${retryCount}/${timeoutList.length})`);
// 等待2秒后重试 // 等待2秒后重试
await new Promise((r) => setTimeout(r, 2000)); await new Promise((r) => setTimeout(r, 2000));
} }