如何在Angular JS中将promise对象保存为$ scope变量

时间:2017-03-21 09:32:29

标签: javascript angularjs ajax angular-promise

Constants.getContants是一个promise,它将获取我的应用程序中使用的所有常量。我想将它保存到$ scope变量,以便我可以在控制器或应用程序中的任何位置访问它。现在,每当我需要访问它时,我需要重复调​​用并在那里进行操作。 即使我尝试将其保存在$ scope中,它也不会在相应的处理程序之外。如何解决这个问题。

以下是我正在使用的代码:

Constants.getConstants().then(function (AppContants) {
           $scope.responseCount = AppContants.data.serverUrl+AppContants.data.appId
       console.log($scope.responseCount);
           //$scope.$apply();
   });

console.log($scope.responseCount);

这里的AJAX调用也不同步。我知道需要在处理程序函数内执行操作,以便我们可以确保只有在成功的AJAX调用之后才执行预期的操作。我需要在函数外部使用这些变量。我尝试了$ scope。$ apply()操作。它没有任何帮助。有办法解决这个问题吗?提前致谢。

4 个答案:

答案 0 :(得分:0)

Constants.getConstants().then(function(response) 
{
     $scope.responseCount = response.data;
}, function(error) 
{
console.log(error);

});

在您的服务中,您应该拥有类似

的内容
 this.getConstants= function($username){
      var endpoint = "url";
      return $http({
        method: 'get',
        url:  endpoint
      });
    };

答案 1 :(得分:0)

在你的情况下,第二个Console.Log在放置AJAX调用之后执行。它不会等待AJAX​​响应,因为它是异步调用。

您只能在解析AJAX校准后使用'$ scope.responseCount'属性。

作为一种解决方法,您可以:

  1. 将此调用放在应用程序启动时获取常量,并将常量保存在某些服务(共享服务)中。
  2. 在此AJAX调用的“then”块中执行操作。

答案 2 :(得分:0)

这就是事情。当您Constants.getConstants()时,它会将响应作为承诺返回。因为javascript异步它不会等到响应返回。它只是继续执行。这就是为什么then函数之外的控制台显示未定义的原因。

解决方法是,您可以在promise中添加一个函数,并将操作放在该函数中

Constants.getConstants().then(function(AppContants) {
    $scope.responseCount = AppContants.data.serverUrl + AppContants.data.appId
    console.log($scope.responseCount);
    sampleFunc() 
});

function sampleFunc() {
    // do your oprations here 
    console.log($scope.responseCount);
}

答案 3 :(得分:0)

您可以在服务中缓存承诺:

app.service("ConstantCache", function(Constants) {
    var promiseCache;
    this.getPromise = function() {
        if ( promiseCache } {
            return promiseCache;
        } else {
            promiseCache = Constants.getConstants();
            return promiseCache;
        };
    };
    this.trashCache = function() {
        promiseCache = null;
    };
});

然后,可以在任何控制器中根据需要多次使用缓存的promise:

ConstantCache.getPromise().then(function(AppContants) {
    $scope.responseCount = AppContants.data.serverUrl + AppContants.data.appId
    console.log($scope.responseCount);
    sampleFunc() 
});