From f2456e411f467785bc33745c10efe928fea785c6 Mon Sep 17 00:00:00 2001 From: a179346 Date: Sat, 2 Mar 2024 21:43:43 +0800 Subject: [PATCH] allow aborting when status is 'error' --- src/index.ts | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/index.ts b/src/index.ts index 7d3b5e0..9f688fc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -162,9 +162,9 @@ export class ChunkUploader { /** * Abort the upload process. - * returns `false` if the status is not `paused`. + * returns `false` if the status is not `paused` or `error`. * - * status: `paused` -> `aborted` + * status: `paused` or `error` -> `aborted` */ public abort() { if (!this.canAbort) return false; @@ -173,7 +173,7 @@ export class ChunkUploader { return true; } public get canAbort() { - return this.status === 'paused'; + return this.status === 'paused' || this.status === 'error'; } /************* @@ -239,8 +239,10 @@ export class ChunkUploader { break; } catch (error) { if (this.status === 'pausing') return false; - if (retry < this._retryDelays.length) await this._waitForRetry(this._retryDelays[retry]); - else { + if (retry < this._retryDelays.length) { + const isPausd = await this._waitForRetry(this._retryDelays[retry]); + if (isPausd) return false; + } else { this.status = 'error'; this._error = error; if (this._onError) this._onError(error); @@ -308,19 +310,28 @@ export class ChunkUploader { } protected _waitForRetry(ms: number) { - return new Promise(resolve => { + return new Promise(resolve => { let isResolved = false; - const handleResolve = () => { + const handleTimeout = () => { + if (isResolved) return; + isResolved = true; + this._removeStatusChangedEventListener('pausing', handlePause); + clearTimeout(timeoutId); + resolve(false); + }; + + const handlePause = () => { if (isResolved) return; isResolved = true; - this._removeStatusChangedEventListener('pausing', handleResolve); - resolve(); + this._removeStatusChangedEventListener('pausing', handlePause); + clearTimeout(timeoutId); + resolve(true); }; - setTimeout(handleResolve, ms); + const timeoutId = setTimeout(handleTimeout, ms); - this._addStatusChangedEventListener('pausing', handleResolve); + this._addStatusChangedEventListener('pausing', handlePause); }); }