如何在async.mapSeries执行完成后正确返回querys函数的执行结果
问题根源
async.mapSeries本身是异步执行的,你当前代码没有等待它执行完成就直接返回了results,此时遍历和数据库查询逻辑还没跑完,数组自然是空的- 你在
async.mapSeries的最终回调里抛出的错误无法被外层的try/catch捕获,会变成未捕获异常,事务回滚逻辑会失效
修正后代码
async querys(querys) { const pool = await poolPromise; if (pool == null) { return [false, 'connect error']; } const transaction = new sql.Transaction(pool); await new Promise(resolve => transaction.begin(resolve)); const request = new sql.Request(transaction) try { // 直接await async.mapSeries的promise返回值,自动收集所有查询结果 const results = await async.mapSeries(querys, async (query) => { console.log('----------') const result = await request.query(query); return result.recordset; }); // 所有查询成功再提交事务 await transaction.commit(); // 按你期望的[true, 对象1, 对象2...]格式返回,要保留嵌套数组就改为return [true, results] return [true, ...results]; } catch(err) { // 任意步骤报错直接回滚 await transaction.rollback(); return [false, err]; } }
改动说明
- 直接
await async.mapSeries,async.js v3+ 本身支持promise调用,不需要传入最终回调,所有异步操作完成后才会向下执行,此时结果已经全部收集完成 - 不需要自己声明空数组push结果,mapSeries会自动把每个迭代函数的返回值收集成结果数组返回
- 所有错误都会被外层
try/catch捕获,事务回滚逻辑可以正常触发
内容的提问来源于stack exchange,提问作者재창킴
相关产品推荐
相关产品推荐

