为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2018-12-13 14:10:05
在一个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在异步操作中执行?
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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


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

    });

});

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


查看完整回答
反对 回复 2019-01-24
  • 1 回答
  • 0 关注
  • 478 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信