如何使用async/await实现多个for循环并行及依赖任务调度
实现方案
async/await 代码实现
首先将4个循环的业务逻辑分别封装为独立的异步函数,内部的数据库操作需正确添加await关键字保证单循环内的执行顺序:
// 循环1:批量删除逻辑 async function execLoop1() { for (const delItem of delList1) { // 替换为实际的异步数据库调用 await db.sql('DELETE FROM target_table WHERE id = ?', [delItem.id]) } } // 循环2:批量删除逻辑 async function execLoop2() { for (const delItem of delList2) { await db.sql('DELETE FROM target_table WHERE id = ?', [delItem.id]) } } // 循环3:新增数据逻辑 async function execLoop3() { for (const addItem of addList) { await db.sql('INSERT INTO target_table (col1, col2) VALUES (?, ?)', [addItem.col1, addItem.col2]) } } // 循环4:更新数据逻辑 async function execLoop4() { for (const updateItem of updateList) { await db.sql('UPDATE target_table SET col1 = ? WHERE id = ?', [updateItem.col1, updateItem.id]) } }
按照需求实现执行逻辑:循环1、2、3同时启动并行执行,循环4仅等待循环3完成后启动,无需等待循环1、2执行结束:
async function runAllTasks() { // 同时启动3个循环,不阻塞,保留Promise引用 const loop1Task = execLoop1() const loop2Task = execLoop2() const loop3Task = execLoop3() // 仅等待循环3执行完成,立即启动循环4 await loop3Task await execLoop4() // 可选:如果需要等待所有任务(含循环1、2)全部完成再结束当前函数,添加下方代码 await Promise.all([loop1Task, loop2Task]) }
业务依赖注意事项
如果你的业务逻辑中,循环1、2的删除操作和循环3的新增操作存在数据依赖(比如删除的是需要新增的旧版本数据),则不能让删除和新增并行,需调整执行顺序为:先并行执行循环1、2,完成后执行循环3,最后执行循环4,代码如下:
async function runTasksWithDeps() { // 先并行执行两个删除任务 await Promise.all([execLoop1(), execLoop2()]) // 删除完成后执行新增 await execLoop3() // 新增完成后执行更新 await execLoop4() }
性能优化方案(替代for循环降低耗时)
for循环逐条执行数据库操作的性能瓶颈主要在频繁的IO交互,可通过以下方案大幅降低耗时:
- 批量SQL操作:将循环内的单条CRUD改为批量语句,单次IO即可完成所有同类型操作,是收益最高的优化方式。比如删除可改为
DELETE FROM target_table WHERE id IN (?),传入待删除ID数组;新增可使用对应数据库支持的批量插入语法,一次性传入所有待新增数据。 - 分组并发执行:如果数据量过大不适合单次批量操作,可将数据拆分为固定大小的分组,每组用
Promise.all并行执行,同时控制并发数避免打满数据库连接,比串行for循环效率提升数倍。 - 事务封装:关联操作建议包裹在数据库事务中提交,减少磁盘落盘次数,同时保证数据一致性。
内容的提问来源于stack exchange,提问作者jbowden97
相关产品推荐
相关产品推荐

