Прямо сейчас я пытаюсь сделать приложение Angular JS для установки CMS. Поэтому я пытаюсь заблокировать доступ к состоянию (ui router), я делаю это с помощью функции разрешения. Но проблема в том, что я делаю запрос на получение 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:
Ваш 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
, функция resolver ждет перед выполнением (или не выполнением) $state.go
.
Для получения дополнительной информации о обещаниях по цепочке см. Ссылку на API-интерфейс AngularJS $ q Service API.
Вызов 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
возвращает обратный вызов, состояние будет загружаться после того, как обещание будет разрешено.