You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者재창킴

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:24:06