React Native SQLite事务未等待结果,如何分步获取数据库数据?
搞定SQLite异步数据获取的问题
嘿,你的问题我一眼就看出来啦——getProfileData函数根本没返回Promise,而await只能等待Promise对象完成,所以才会拿到undefined。SQLite的transaction和executeSql都是回调式的异步操作,得把它们包装成Promise才能和async/await搭伙干活。
修改后的可行代码
function getProfileData() { // 把整个异步操作包进Promise里 return new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( 'SELECT value FROM tbl_config WHERE name="user_email"', [], // 查询成功的回调:把结果通过resolve传出去 (tx, results) => { const userEmail = results.rows.item(0).value; console.log(userEmail); resolve(userEmail); }, // 查询出错的回调:用reject抛出错误 (tx, error) => { console.error('查询翻车了:', error); reject(error); return true; // 标记错误已处理,避免后续默认报错 } ); }, // 事务本身出错的回调 (error) => { console.error('事务启动失败:', error); reject(error); }); }); } async function fetchData() { console.log('before fetch'); try { const res = await getProfileData(); console.log(res); // 现在终于能拿到正确的用户邮箱啦 console.log('after fetch'); // 这里放心写依赖res的后续逻辑就行,肯定是等数据回来才执行 } catch (error) { // 万一出错了,这里能接住错误,不至于整个程序挂掉 console.error('获取用户数据失败:', error); } } fetchData();
为啥原来的代码不行?
你之前的getProfileData返回的是db.transaction的执行结果(这玩意儿不是Promise),而且里面的return results.rows.item(0).value是在executeSql的回调函数里,这个return根本传不到外层函数去,所以await自然拿不到值。
核心修改点
- 给异步操作套个Promise壳:用Promise的
resolve传递成功结果,reject传递错误,让await能“等”到它。 - 把回调里的结果抛出来:原来的return在回调里无效,现在用
resolve(userEmail)把结果传递给外层的await。 - 加上错误处理:不管是事务出错还是SQL查询出错,都用
reject抛出来,再在fetchData里用try/catch接住,程序更健壮。
这样改完之后,就能完美实现“等数据库数据返回再执行后续函数”的需求啦~
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

