假设以下AngularJS服务工厂:
function Constants($http) {
var constants = {
someFields: someValues
};
$http({method: "GET", url: baseUrl + "/constants.json"}).success(
function (data, status) {
angular.forEach(data, function (value, key) {
constants[key] = value;
});
}
);
return constants;
}
它创建了一个服务Constants
,其中包含一组常量。常量部分是硬编码的,部分是从位于服务器上的constants.json
加载的(这个逻辑是不可讨论的)。然后在控制器中使用此服务:
function SettingsController($scope, $rootScope, Constants) {
$scope.someProperty = Constants.somePropertyFromConstantsJson;
...
我知道$http
调用是异步的。这意味着无法保证示例中constants.json
的属性将在Constants
中读取之前加载并放入SettingsController
。
我怎样才能提供这样的保证?如果SettingsController
中的$http
电话结束后,我怎样才能初始化Constants
?
Constants
保留一个对象,其属性可以通过.
或[]
访问。这就是为什么我会考虑不适合这种愿望的选择作为最后的手段。
UPD2:我检查了标记为重复的问题。实际上,我理解$http
是异步操作,我无意提取Constants
工厂构造函数的本地回调状态。 Constants
构造函数的代码可以做到这一点,但我可以重构它(直到Constants
服务的类型及其属性被保留)。在 Http调用完成后,我只想要一种方法让Angular创建Constants
service 。某种异步服务初始化。我认为我的愿望与东西的异性并不矛盾,如果我错了,请纠正我。
答案 0 :(得分:0)
让异常访问常量,而不是直接将常量隐藏在promise之后。
类似的东西:
function Constants($http, $q) {
var constants = {
someFields: someValues
};
const defer = $q.defer();
$http({
method: "GET",
url: baseUrl + "/constants.json"
}).success(
function(data, status) {
angular.forEach(data, function(value, key) {
constants[key] = value;
});
}
).then(() => defer.resolve(constants));
return {
whenLoaded: () => defer.promise;
};
}
function SettingsController($scope, $rootScope, Constants) {
Constants.whenLoaded().then((constants) => $scope.someProperty = constatns);
}