使用$ http的服务和使用该服务的控制器之间的障碍?

时间:2018-05-25 15:26:44

标签: javascript angularjs angular-promise

假设以下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

UPD:我所谈论的案例是一个更大项目的一部分。我希望避免在整个代码库中进行更大的更改,因此我需要Constants保留一个对象,其属性可以通过.[]访问。这就是为什么我会考虑不适合这种愿望的选择作为最后的手段。

UPD2:我检查了标记为重复的问题。实际上,我理解$http是异步操作,我无意提取Constants工厂构造函数的本地回调状态。 Constants构造函数的代码可以做到这一点,但我可以重构它(直到Constants服务的类型及其属性被保留)。在 Http调用完成后,我只想要一种方法让Angular创建Constants service 。某种异步服务初始化。我认为我的愿望与东西的异性并不矛盾,如果我错了,请纠正我。

1 个答案:

答案 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);
}