是否无法在异步操作中中使用cordova中调用sqlite

发布于 2022-09-05 21:47:10 字数 1013 浏览 15 评论 0

在一个ionic1项目中,需求要做到离线数据库功能,故使用了cordova中的sqlite插件,数据库中的数据会由首次加载app时请求后台数据获取;
但这时发现貌似无法在异步操作中调用sqlite操作,比如最简单的定时器:

$timeout(function(){
    //执行sqlite操作
},1000);

此时定时器内部的函数并不会执行,并且报错:

"InvalidStateError: DOM Exception 11: This transaction is already finalized. Transactions are committed after its success or failure handlers are called. If you are using a Promise to handle callbacks, be aware that implementations following the A+ standard adhere to run-to-completion semantics and so Promise resolution occurs on a subsequent tick and therefore after the transaction commits."

而之后尝试使用了jq的ajax并将其修改为了同步执行:

$.ajax({
    data: data,
    url: url,
    type: 'post',
    timeout: 3000,
    async: false,
    success: function(data){
        //执行sqllite操作
    },
    error: function() {
        //error
    }
})

此时就不再会报之前的一长串错误并且成功回调能够正常执行;

但是实际项目中不可能使用这种极有可能阻塞整个app的方法(比如用户信号不佳),请问是否有解决方法能够让sqlite在异步操作中执行?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

彻夜缠绵 2022-09-12 21:47:11

时间过去挺久了,讲下如何解决的这种问题,避免以后有同样踏坑的兄弟

cordova sqlite插件中貌似是存在有异步监测机制,当我们异步操作时会自动提交所有的事物(transaction),在我理解中等同于关闭了该操作线程,所以这个时候就需要重新进行打开操作

var dbOpen = window.sqlitePlugin.openDatabase({
    name: 'xxx.db',
    location: 'default'
});

然后再次在异步的回调函数中重新使用

dbOpen.transaction(function(tx){
    tx.executeSql("SQL语句...",function(tx,res){
        //do sth
    },function(tx){
        //err
    });
});

如有理解不正确,欢迎指点、讨论

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文