From a8627595f32c25bfda302b3cd4e0c8be77af0e77 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Sun, 27 Feb 2022 14:35:47 +0800 Subject: [PATCH] Fix: task pool cannot release task after it fails --- src/component/Uploader/UseUpload.js | 2 +- src/component/Uploader/core/uploader/base.ts | 2 +- src/component/Uploader/core/utils/pool.ts | 13 ++++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/component/Uploader/UseUpload.js b/src/component/Uploader/UseUpload.js index 6024759..63f29f0 100644 --- a/src/component/Uploader/UseUpload.js +++ b/src/component/Uploader/UseUpload.js @@ -4,7 +4,7 @@ import { Status } from "./core/uploader/base"; export function useUpload(uploader) { const startTimeRef = useRef(null); const [status, setStatus] = useState(uploader.status); - const [error, setError] = useState(null); + const [error, setError] = useState(uploader.error); useEffect(() => { startTimeRef.current = Date.now(); /* eslint-disable @typescript-eslint/no-empty-function */ diff --git a/src/component/Uploader/core/uploader/base.ts b/src/component/Uploader/core/uploader/base.ts index 221f6be..8d2a437 100644 --- a/src/component/Uploader/core/uploader/base.ts +++ b/src/component/Uploader/core/uploader/base.ts @@ -72,11 +72,11 @@ export default abstract class Base { return; } + this.logger.info("Enqueued in manager pool"); this.manager.pool.enqueue(this).catch((e) => { this.logger.info("Upload task failed with error:", e); this.setError(e); }); - this.logger.info("Enqueued in manager pool"); }; public upload = async () => { diff --git a/src/component/Uploader/core/utils/pool.ts b/src/component/Uploader/core/utils/pool.ts index 0fe4ac7..4b00e7a 100644 --- a/src/component/Uploader/core/utils/pool.ts +++ b/src/component/Uploader/core/utils/pool.ts @@ -23,16 +23,23 @@ export class Pool { }); } + release(item: QueueContent) { + this.processing = this.processing.filter((v) => v !== item); + this.check(); + } + run(item: QueueContent) { this.queue = this.queue.filter((v) => v !== item); this.processing.push(item); item.uploader.upload().then( () => { - this.processing = this.processing.filter((v) => v !== item); item.resolve(); - this.check(); + this.release(item); }, - (err) => item.reject(err) + (err) => { + item.reject(err); + this.release(item); + } ); }