【问题标题】:Ionic & SQLite - Structuring init load with promisesIonic & SQLite - 使用 Promise 构建初始化负载
【发布时间】:2016-03-21 19:54:33
【问题描述】:

我无法解决我的问题,我终于明白我相信了。

我必须初始化 SQLite 数据库中的用户数据,我正在通过 cordova sqlite plugin 运行该数据库。我的问题是读取数据库是在异步可延迟this.loadData 函数中(如下)。 (我可能是“过时的”,但我在这里的主要抱怨 - 为什么数据库访问不能像所有其他健全的数据库实现一样在同步函数中?没有可延迟它会很简单。)

我的控制器对$stateChangeSuccess 做出反应,我在其中显示leaflet.js 映射,该映射由状态控制器中的$urlRouterProvider.otherwise('/app/map'); 立即启动。

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

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

最好的方法是什么?我可以制作一个在加载所有内容时触发的自定义事件吗?我应该在等待所有进度的初始屏幕之后添加一个中间视图吗?

本质上,我必须让整个应用程序加载过程等到我的数据加载完毕,并且当 SQLite 强制让所有数据访问成为承诺时,我不知道如何处理这个问题。我真的希望以某种方式选择同步/异步数据库访问。

//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');
}

【问题讨论】:

    标签: angularjs sqlite cordova ionic-framework


    【解决方案1】:

    当你返回一个 Promise 时,你必须在 then statament 上解决它,并且在它里面你可以做一个重定向。

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

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多