修复暂停下载继续后不结束下载的问题
This commit is contained in:
@@ -309,6 +309,8 @@ class DownloadService {
|
||||
|
||||
// 获取更新后的任务
|
||||
const updatedTask = this.taskManager.getTask(taskId);
|
||||
|
||||
// 立即通知状态更新
|
||||
this.progressManager.notifyProgressUpdate(taskId, updatedTask);
|
||||
|
||||
logger.info('任务暂停完成', { taskId });
|
||||
@@ -336,13 +338,6 @@ class DownloadService {
|
||||
return { success: false, error: '任务不存在' };
|
||||
}
|
||||
|
||||
// logger.info('尝试恢复任务', {
|
||||
// taskId,
|
||||
// currentStatus: task.status,
|
||||
// type: task.type,
|
||||
// artwork_id: task.artwork_id
|
||||
// });
|
||||
|
||||
// 只允许恢复暂停的任务
|
||||
if (task.status !== 'paused') {
|
||||
logger.warn('恢复任务失败:任务状态不是暂停状态', {
|
||||
@@ -357,14 +352,19 @@ class DownloadService {
|
||||
logger.info('开始恢复任务执行', { taskId });
|
||||
await this.downloadExecutor.resumeTask(taskId);
|
||||
|
||||
// 获取更新后的任务状态
|
||||
// 确保状态已经更新后再返回
|
||||
const updatedTask = this.taskManager.getTask(taskId);
|
||||
|
||||
// 立即通知状态更新
|
||||
this.progressManager.notifyProgressUpdate(taskId, updatedTask);
|
||||
|
||||
logger.info('任务恢复成功', {
|
||||
taskId,
|
||||
newStatus: updatedTask.status
|
||||
});
|
||||
|
||||
// 返回最新的任务状态
|
||||
return { success: true, data: updatedTask };
|
||||
} catch (error) {
|
||||
logger.error('恢复任务执行失败', {
|
||||
taskId,
|
||||
@@ -374,8 +374,6 @@ class DownloadService {
|
||||
// 如果恢复失败,保持暂停状态
|
||||
return { success: false, error: `恢复任务失败: ${error.message}` };
|
||||
}
|
||||
|
||||
return { success: true, data: this.taskManager.getTask(taskId) };
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -503,19 +503,20 @@ class FileManager {
|
||||
throw error;
|
||||
}
|
||||
|
||||
// 处理其他文件系统错误
|
||||
const errorResult = ErrorHandler.handleFileSystemError(error, filePath, 'download');
|
||||
// 检查是否是可重试的网络错误
|
||||
const isRetryable = ErrorHandler.isRetryableError(error);
|
||||
|
||||
logger.error(`下载文件失败 (尝试 ${attempt}/${maxRetries}): ${filePath}`, {
|
||||
error: error.message,
|
||||
stack: error.stack,
|
||||
url,
|
||||
retryable: errorResult.retryable,
|
||||
attempt
|
||||
retryable: isRetryable,
|
||||
attempt,
|
||||
errorCode: error.code
|
||||
});
|
||||
|
||||
// 如果不是可重试的错误,直接抛出
|
||||
if (!errorResult.retryable) {
|
||||
if (!isRetryable) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
|
||||
@@ -305,11 +305,24 @@ class ErrorHandler {
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为可重试的错误
|
||||
* 判断错误是否可重试
|
||||
*/
|
||||
static isRetryableError(error) {
|
||||
const retryableCodes = ['EPERM', 'EACCES', 'EBUSY', 'EAGAIN', 'ENOSPC'];
|
||||
return retryableCodes.includes(error.code);
|
||||
const retryableCodes = ['EPERM', 'EACCES', 'EBUSY', 'EAGAIN', 'ENOSPC', 'ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND'];
|
||||
const retryableMessages = ['aborted', 'socket hang up', 'network timeout'];
|
||||
|
||||
// 检查错误码
|
||||
if (retryableCodes.includes(error.code)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查错误消息
|
||||
if (error.message) {
|
||||
const message = error.message.toLowerCase();
|
||||
return retryableMessages.some(msg => message.includes(msg));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -327,7 +340,20 @@ class ErrorHandler {
|
||||
case 'EPERM':
|
||||
case 'EACCES':
|
||||
return Math.min(delay, 5000); // 权限错误,中等延迟
|
||||
case 'ECONNRESET':
|
||||
case 'ETIMEDOUT':
|
||||
return Math.min(delay, 3000); // 网络错误,较短延迟
|
||||
case 'ENOTFOUND':
|
||||
return Math.min(delay, 5000); // DNS错误,中等延迟
|
||||
default:
|
||||
// 检查是否是网络相关的错误消息
|
||||
if (error.message && (
|
||||
error.message.toLowerCase().includes('aborted') ||
|
||||
error.message.toLowerCase().includes('socket hang up') ||
|
||||
error.message.toLowerCase().includes('network timeout')
|
||||
)) {
|
||||
return Math.min(delay, 3000); // 网络错误,较短延迟
|
||||
}
|
||||
return delay;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user