我无法解决我的问题,我终于理解了这一点。
我必须从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');
}
答案 0 :(得分:0)
当您返回承诺时,您必须在then
statament上解决它,并且在其中您可以进行重定向。
loadData
.then(loadDataSuccess)
.catch(loadDataError)
function loadDataSuccess(data){
$state.go('map')
}
function loadDataError(error){
//do stuff
}