离子和SQLite - 使用promises

时间:2016-03-21 19:54:33

标签: angularjs sqlite cordova ionic-framework

我无法解决我的问题,我终于理解了这一点。

我必须从SQLite数据库初始化用户数据,我正在cordova sqlite plugin运行该数据库。我的问题是读取数据库是在异步可延迟的this.loadData函数中(下面)。 (我可能是“老式的”,但我在这里的主要抱怨 - 为什么DB访问不能像所有其他理智的数据库实现一样处于同步功能?没有可延迟的,它将是直接的。)

我的控制器对显示$stateChangeSuccess地图的leaflet.js作出反应,该地图由状态控制器内的$urlRouterProvider.otherwise('/app/map');立即启动。

我的问题是我不知道如何在加载所有数据之前停止视图控制器加载。我尝试将SQLite数据加载到$ionicPlatform.ready中,以便立即触发加载,但在设备上加载视图会超过后台SQLite线程。

我还尝试在模块实例化期间通过最后调用this.loadData()来加载模块内的数据。但是,cordova模块在此之前不会被初始化并失败。

最好的方法是什么?我可以创建一个自定义事件,当一切都被加载时会触发吗?我应该在启动画面之后添加一个等待所有进度的中间视图吗?

基本上我必须让整个应用程序加载过程等到我的数据被加载,并且当SQLite强制一个使所有数据访问一个promise时不知道如何处理这个。我真的更愿意以某种方式选择同步/异步数据库访问。

//this is in a module dataService
this.loadData = function(){
        if(!myDB)
            myDB = $cordovaSQLite.openDB('my.db');

        var deferred = $q.defer();

        myDB.transaction(function(transaction1) {

            transaction1.executeSql('SELECT ID,Data FROM myDB;', [],
                    function(tx, result) {
                console.log(result.rows.length);
                var dataJSON = result.rows.item(0).Data;
                var dataParsed = JSON.parse(dataJSON);
                deferred.resolve(dataParsed);
            },
            function(error) {
                console.log("SELECT failed. Must create table first");
                //do other stuff ... 
            });
        });

        return deferred.promise;
    }

// in my MapViewController the app reacts to 
    $scope.$on("$stateChangeSuccess", function() {
     // init views with the data that should be available now
    }
//this is in the starter module

angular.module('starter',[]).config(function($stateProvider, $urlRouterProvider){
\\... states ...
$urlRouterProvider.otherwise('/app/map');
}

1 个答案:

答案 0 :(得分:0)

当您返回承诺时,您必须在then statament上解决它,并且在其中您可以进行重定向。

loadData
    .then(loadDataSuccess)
    .catch(loadDataError)
    function loadDataSuccess(data){
          $state.go('map')
    }
    function loadDataError(error){
          //do stuff
    }