|
@@ -61,18 +61,18 @@ export async function forEachAsync(
|
|
|
array: any[],
|
|
|
concurrency: number,
|
|
|
asyncFn: (item: any, index: number) => Promise<void>,
|
|
|
+ timeout: number=60000,
|
|
|
) {
|
|
|
let running = 0 // 当前正在运行的任务数
|
|
|
let completed = 0 // 完成的任务数
|
|
|
let currentTaskIndex = 0 // 当前任务索引
|
|
|
|
|
|
- return new Promise<void>(resolve => {
|
|
|
+ return new Promise<void>((resolve, reject) => {
|
|
|
// 执行任务的函数
|
|
|
const runTask = async () => {
|
|
|
if (completed >= array.length) {
|
|
|
// 所有任务都完成了
|
|
|
resolve()
|
|
|
- process.exit()
|
|
|
}
|
|
|
|
|
|
// 如果有可运行的任务且没有超过并发限制
|
|
@@ -84,10 +84,21 @@ export async function forEachAsync(
|
|
|
|
|
|
// 立即执行异步函数
|
|
|
;(async () => {
|
|
|
- await asyncFn(item, index) // 等待异步任务完成
|
|
|
- running-- // 任务完成,减少正在运行的任务数
|
|
|
- completed++ // 增加完成的任务数
|
|
|
- runTask() // 尝试运行下一个任务
|
|
|
+ try {
|
|
|
+ await Promise.race([
|
|
|
+ asyncFn(item, index), // 等待异步任务完成
|
|
|
+ new Promise<void>((_, reject) =>
|
|
|
+ setTimeout(() => reject(new Error('任务超时')), timeout),
|
|
|
+ ),
|
|
|
+ ])
|
|
|
+ } catch (error) {
|
|
|
+ reject(error) // 任务超时或发生错误,直接拒绝主Promise
|
|
|
+ return
|
|
|
+ } finally {
|
|
|
+ running-- // 任务完成或失败,减少正在运行的任务数
|
|
|
+ completed++ // 增加完成的任务数
|
|
|
+ runTask() // 尝试运行下一个任务
|
|
|
+ }
|
|
|
})()
|
|
|
}
|
|
|
}
|