javascript - 我的日志在 sqlite 数据库事务之后没有执行?为什么它在数据库事务之前执行?
问题描述
我正在从 Sqlite 表中获取数据并在本机反应中存储到数组“favoritesData”中,但问题是,db 事务在日志之后执行,这意味着我得到一个空数组。
任何人都有以下代码的解决方案....
getFavorits =() => {
favoritesData = []
db.transaction(tx => {
tx.executeSql(
'SELECT * FROM table_favorites', [],
(tx, results) => {
len = results.rows.length;
console.log('Total Fav = ', len);
if (len > 0) {
for (let i = 0; i < results.rows.length; ++i) {
favoritesData.push(results.rows.item(i));
}
}
}
);
});
console.log("FAV DATA: ",favoritesData)
}
解决方案
事务是异步的。它不是阻塞的,因此日志记录将(很可能)在数据库操作完成之前执行。您需要将日志记录移动到承诺链中。交易完成后:
getFavorites = () => {
favoritesData = [];
db.transaction(tx =>
tx.executeSql(
'SELECT * FROM table_favorites', [],
(tx, results) => {
len = results.rows.length;
console.log('Total Fav = ', len);
for (let i = 0; i < results.rows.length; ++i) {
favoritesData.push(results.rows.item(i));
}
}
);
).then(() => {
console.log("FAV DATA: ",favoritesData)
})
}
或者只是在循环之后记录:
getFavorites = () => {
favoritesData = [];
db.transaction(tx =>
tx.executeSql(
'SELECT * FROM table_favorites', [],
(tx, results) => {
len = results.rows.length;
console.log('Total Fav = ', len);
for (let i = 0; i < results.rows.length; ++i) {
favoritesData.push(results.rows.item(i));
}
console.log("FAV DATA: ",favoritesData)
}
);
)
}
也不需要 if(len > 0) ,因为循环会处理这个问题。
推荐阅读
- c++ - 不能为我自己的班级重载运算符 <<
- java - Micronaut 中用于 RESTful API 的反应式方法/类型
- random - 我如何随机化窗口上小部件的位置以使其每次都不同
- node.js - 如何在“Transform#flush”期间正确处理背压
- json - Micronaut JSON 帖子删除引号
- c# - 在 Unity C# 中动态渲染游戏对象
- scala - Scala:如何找到超过 2 个元素的最小值?
- regex - Angular 6 正则表达式测试大写,小写,特殊字符不起作用
- android - 使用 OnSuccessListener 然后在方法中使用 PrintStream 会出错
- c# - 使用 PowerShell 发送电子邮件