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

React Native中SQLite事务提前resolve,如何等待内部调用完成?

解决React Native SQLite事务async/await不等待异步操作完成的问题

你的问题核心是所用SQLite库的transaction方法不支持直接处理传入的async函数——它会在回调函数开始执行后立即标记事务完成,不会等待内部的await insertIntoDatabase操作结束,导致第二个事务还没执行,loadData就提前resolve,所以after loadData会先于第二个事务的日志打印。

解决方案

把原生的transaction方法封装成支持async/await的Promise版本,手动控制事务的resolve时机,确保只有内部所有异步操作完成后才标记事务结束。

1. 封装异步事务函数

const asyncTransaction = (db, callback) => {
  return new Promise((resolve, reject) => {
    db.transaction(async (tx) => {
      try {
        // 等待回调内所有异步操作完成
        await callback(tx);
        resolve();
      } catch (err) {
        // 捕获错误并reject,触发事务回滚
        reject(err);
      }
    }, reject); // 传递transaction自身的错误回调
  });
};

2. 修改loadData函数使用封装后的方法

const loadData = async (data1, data2) => {
  await asyncTransaction(dbInstance, async tx => {
    console.tron.log('before insert call 1');
    await insertIntoDatabase(dbInstance, 'inventories', data1);
    console.tron.log('after insert call 1');
  });

  await asyncTransaction(dbInstance, async tx => {
    console.tron.log('before insert call 2');
    await insertIntoDatabase(dbInstance, 'inventoryDetails', data2);
    console.tron.log('after insert call 2');
  });
};

效果说明

现在asyncTransaction返回的Promise会等待内部的回调(包含你的插入操作)完全执行完毕才resolve,外部的await能正确等待每个事务完成后再执行下一个。最终输出会和你预期的一致:

'before loadData'
'before insert call 1'
'after insert call 1'
'before insert call 2'
'after insert call 2'
'after loadData'

注意:原代码中的Promise.resolve()完全多余,async函数本身会自动返回Promise,原生transaction方法也不会识别这个返回值,所以可以直接删除。

内容的提问来源于stack exchange,提问作者Ricardo Cardoso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:55:29