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
相关产品推荐
相关产品推荐

