现在,我正在尝试做一个角度JS安装应用程序,以安装一个CMS。因此,我试图阻止对状态(ui路由器)的访问,我使用的是一个解析函数。但问题是,我向API发出get请求,该API返回true或false,解析函数不等待get请求完成,所以它只是加载状态。
这是我的代码:
app.run(['$rootScope', '$http', function($rootScope, $http) {
$rootScope.$on('$stateChangeStart', function() {
$http.get('/api/v1/getSetupStatus').success(function(res) {
$rootScope.setupdb = res.db_setup;
$rootScope.setupuser = res.user_setup;
});
});
}]);
app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise("/404");
$stateProvider.state('db-install', {
url: "/install/db",
templateUrl: 'admin/js/partials/db-install.html',
controller: 'DBController',
resolve: {
data: function($q, $state, $timeout, $rootScope) {
var setupStatus = $rootScope.setupdb;
var deferred = $q.defer();
$timeout(function() {
if (setupStatus === true) {
$state.go('setup-done');
deferred.reject();
} else {
deferred.resolve();
}
});
return deferred.promise;
}
}
})
.state('user-registration', {
url: "/install/user-registration",
templateUrl: "admin/js/partials/user-registration.html",
controller: "RegisterController"
})
.state('setup-done', {
url: "/install/setup-done",
templateUrl: "admin/js/partials/setup-done.html"
})
.state('404', {
url: "/404",
templateUrl: "admin/js/partials/404.html"
});
}]);在这里您可以看到加载页面的时间线:

在这里您可以看到API返回的内容:

发布于 2016-01-03 06:03:29
您的db-install解析器函数需要从$http.get链接以获得安装状态。
$stateProvider.state('db-install', {
url: "/install/db",
templateUrl: 'admin/js/partials/db-install.html',
controller: 'DBController',
resolve: {
data: function($state, $http) {
return $http.get('/api/v1/getSetupStatus'
).then (function(result) {
var setupdb = result.data.db_setup;
var user_setup = result.data.user_setup;
//return for chaining
return setupdb;
}).then (function (setupStatus) {
//use chained value
if (setupStatus === true {
//chain with $state.go promise
return $state.go('setup-done');
} else {
//resolve promise chain
return 'setup-not-done';
};
})
}
}
})通过从状态$http.get返回和链接,解析器函数在执行(或不执行) $state.go之前等待。
有关链接承诺的更多信息,请参见AngularJS $q服务API引用-链接承诺。
发布于 2016-01-02 03:21:28
对getSetupStatus的调用在$stateChangeStart中执行,因此resolve不知道必须等待。您可以将$http调用放入解析函数中,如下所示:
function($q, $state, $timeout) {
return $http.get('/api/v1/getSetupStatus')
.then(function(res) {
if(res.db_setup) {
$state.go('setup-done');
}
else {
return true;
}
});
}通过使resolve参数返回回调,状态将在承诺已成定局之后加载。
https://stackoverflow.com/questions/34561087
复制相似问题