亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否無法在異步操作中中使用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條經驗 獲得超13個贊

時間過去挺久了,講下如何解決的這種問題,避免以后有同樣踏坑的兄弟


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 關注
  • 505 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號