从服务

时间:2015-10-22 08:57:42

标签: angularjs asynchronous angular-promise angular-services angularjs-http

我尝试在服务中请求一些数据。我想确保数据保存在服务的变量中,因为由于状态的变化,我的控制器将一直重新加载,我只需要在网站加载时使用ONCE数据。

  app.service('resultDeals',['$translate','$cookies','$http',
    function($translate,$cookies,$http) {

      var currentOrigin = {};
      var originsUser={};

      return {

        loadOrigins:function() {
          $http.get('app/deals/deal.json').success(function(response){
            console.log(response);
            originsUser = response.data;
            return originsUser
          }).error(function(err){
            console.log(err);
          });
        },
        userOrigin:originsUser

      };

    }]);

我的控制器如下所示

console.log(resultDeals.loadOrigins());
    $scope.updateOrigins=resultDeals.loadOrigins();

问题是resultDeals.loadOrigins()始终未定义。

我想确保将从loadOrigins()获取的数据存储在服务变量中,并且只在需要时才从控制器访问它,以便在控制器重新加载数据时不再需要获取数据。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用异步代码时,必须处理promises。 <{1}}必须返回一个承诺,您的控制器必须使用它。

loadOrigins

答案 1 :(得分:2)

不要使用.success&amp; .error回调函数,因为它们无法返回任何内容,因此无法继续使用promise链。而是在.then方法(返回promise对象)上使用$http.get。这将具有return data的能力,而承诺是resolvedreject承诺。您可以从控制器方法继续promise链。

<强>服务

return {
    loadOrigins: function() {
        return $http.get('app/deals/deal.json')
          .then(function(response) {
            console.log(response);
            originsUser = response.data;
            return originsUser
          }, function(err) {
            console.log(err);
          });
    },
    userOrigin: originsUser
};

<强>控制器

resultDeals.loadOrigins().then(function(user){
   $scope.updateOrigins= user;
}, function(){
   console.log("Errror occurred.")
})