From 17200150dd7d8bcac2ebf3ba251a4ea6d5a4efa2 Mon Sep 17 00:00:00 2001 From: awalol Date: Sat, 12 Jul 2025 18:44:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(DownloadAll):=20=E5=B9=B6=E8=A1=8C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DownloadAll.tsx | 48 ++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/components/DownloadAll.tsx b/src/components/DownloadAll.tsx index 5641f0b..298516b 100644 --- a/src/components/DownloadAll.tsx +++ b/src/components/DownloadAll.tsx @@ -6,6 +6,7 @@ import { toast } from 'react-toastify'; export function DownloadAll() { const files = useAppSelector(selectFiles); const onClickDownloadAll = async () => { + console.time('DownloadAll'); //开始计时 if (Object.keys(files).length === 0) { toast.warning('未添加文件'); return; @@ -20,11 +21,10 @@ export function DownloadAll() { //过滤处理失败的文件 const completeFiles = Object.values(files).filter((file) => file.state === ProcessState.COMPLETE); - const filesLength = Object.keys(completeFiles).length; + const fileCount = Object.keys(files).length; //开始下载 let dir: FileSystemDirectoryHandle | undefined; - let success = 0; try { dir = await window.showDirectoryPicker({ mode: 'readwrite' }); } catch (e) { @@ -34,27 +34,35 @@ export function DownloadAll() { } } toast.warning('开始下载,请稍候'); + + let success = 0; + const promises: Promise[] = []; for (const [_, file] of Object.entries(completeFiles)) { - if (file.state !== ProcessState.COMPLETE) { - return; - } - try { - if (dir) { - await DownloadNew(dir, file); - } else { - await DownloadOld(file); - } - success++; - } catch (e) { - console.error(`下载失败: ${file.fileName}`, e); - toast.error(`出现错误: ${e}`); - } + const promise = new Promise((resolve, reject) => { + console.log(`开始下载: ${file.fileName}`); + const action = dir ? DownloadNew(dir, file) : DownloadOld(file); + action.then( + () => { + console.log(`成功下载: ${file.fileName}`); + success++; + resolve(); + }, + (e) => { + console.error(`下载失败: ${file.fileName}`, e); + toast.error(`出现错误: ${e}`); + reject(e); + }, + ); + }); + promises.push(promise); } - if (success === filesLength) { - toast.success(`成功下载: ${success}/${filesLength}首`); - } else { - toast.warning(`成功下载: ${success}/${filesLength}首`); + try { + await Promise.allSettled(promises); + toast.success(`成功下载: ${success}/${fileCount}首`); + } catch { + toast.warning(`成功下载: ${success}/${fileCount}首`); } + console.timeEnd('DownloadAll'); //停止计时 }; return (