并發批量請求處理器
? 設計目標
該類用于批量異步請求處理,支持:
- 自定義并發數
- 請求節拍控制(延時)
- 失敗重試機制
- 進度回調通知
🔧 構造函數參數
new BulkRequestHandler({dataList, // 要處理的數據列表requestFn, // 每條數據的處理函數(返回Promise)concurrency = 5, // 并發請求數delay = 100, // 請求間隔時間(ms)retry = 3, // 每條數據最大重試次數onProgressUpdate = () => {} // 進度更新回調函數
})
🔁 核心執行流程
1. start() 啟動任務處理
const workers = Array(this.concurrency).fill(null).map(() => this._worker());
await Promise.all(workers);
return this.results;
-
啟動多個“工人(worker)任務”并行處理數據。
-
每個 worker 會不斷從共享的 this.index 中取任務,直到任務取盡
2. _worker() 單個任務工人執行邏輯
while (this.index < this.dataList.length) {const currentIndex = this.index++;const item = this.dataList[currentIndex];try {const result = await this._requestWithRetry(item, this.retry);this.results[currentIndex] = result;} catch (err) {this.results[currentIndex] = {name: item.name,address: item.address,error: err.message,success: false};}this.completed++;this.onProgressUpdate(this.completed);await new Promise((res) => setTimeout(res, this.delay));
}
流程說明:
-
從共享索引中取出當前任務項。
-
調用 _requestWithRetry() 嘗試處理該項。
-
處理完成或失敗后記錄結果。
-
更新完成數量,并觸發進度回調。
-
可選的節拍等待,避免請求過快
3. _requestWithRetry() 重試機制處理
try {return await this.requestFn(item);
} catch (err) {if (retriesLeft <= 1) throw err;await new Promise(res => setTimeout(res, 200 * (this.retry - retriesLeft + 1)));return await this._requestWithRetry(item, retriesLeft - 1);
}
說明:
-
如果請求失敗,則根據剩余重試次數,指數退避式延遲后重試。
-
最多重試 retry 次,失敗則拋出錯誤交由上層處理
小結:執行順序圖
start()├─ 創建多個 worker 并發執行├─ 每個 worker 循環取任務│ ├─ 獲取 dataList[index++]│ ├─ 嘗試執行 requestFn(帶重試)│ ├─ 記錄結果到 results[]│ ├─ 調用進度回調│ └─ 可選 delay 等待└─ 所有 worker 結束后,返回 results
📚 示例代碼
全部代碼鏈接