hel 1 жил өмнө
parent
commit
f4a7fb37d1

+ 1 - 1
src/onchain/week2/randomWeek2.ts

@@ -7,7 +7,7 @@ async function startCheck(concurrency) {
     where: {
       finish: 0,
     },
-    take: 20000,
+    take: 40000,
   })
   await forEachAsync(accountsRaw, concurrency, async (account, index) => {
     console.log(`${index}/${accountsRaw.length}: processing ${account.address}`)

+ 17 - 6
src/utils/index.ts

@@ -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() // 尝试运行下一个任务
+          }
         })()
       }
     }