使用服务中服务器的数据

时间:2016-04-19 07:46:09

标签: angularjs angular-promise

我已经asked a question关于这个话题,所以这实际上是一个后续行动:

我想创建一个角度服务,当第一次加载应用时,将从服务器获取数据然后我将能够从本地查询数据服务对象。以下是我尝试过的方法:

angular.module('my.services').factory('Properties', function ($http) {

  var properties = $http.get("/properties");

  return {
    get: function (property) {          
      return properties[property];
    }
  }
});

问题是 - $http.get()是异步的,为了实现我想要做的事情,我必须同步使用它。有没有办法用" native" AngularJS?或者我必须使用XHR调用吗?

仅供澄清:此问题与原始问题的区别在于,我不仅希望对property执行某些操作,例如将其打印到日志中。实际上我想使用property作为从服务器返回的数据的密钥。如果控制器调用get时数据还没有 - 我希望它等到数据返回。

这是我现在拥有的非常不优雅的东西:

return {
    get: function (property) {
      while(!properties.$resolved) {
        setTimeout(function() {}, 2000)
      }
      return properties[property];
    }
 }

3 个答案:

答案 0 :(得分:1)

此:

return properties[property];

不起作用。请记住,properties是一个承诺。它可能不包含名为property的属性。你必须像这样使用它:

  return {
    get: function (property) {          
      return properties.then(function(response){
        return response.data[property];
      })
    }
  }

这将返回一个带有'property'作为内部结果的promise。所以在你的控制器中,像这样使用它:

Properties.get(myProp).then(function(property){
    //do something
});

其次,在控制器被调用之前等待承诺解析(我不确定你是否真的需要这个):使用resolve库的angular ui router属性。更多信息:https://github.com/angular-ui/ui-router/wiki#resolve

答案 1 :(得分:1)

你可以这样做:

在您的服务中注入$ q,然后:

 return {

   get: function(property){

    var deferred = $q.defer();

    $http.get("/properties").then(function(res){

     deferred.resolve(res.data[property]);

     }).catch(function(err){

       //handle error
       console.log(err);
       deferred.reject(err)

      })

      return deferred.promise;

    }

 }

然后在你的控制器中调用它:

Properties.get(prop).then(function(res){

  $scope.mydata = res; //or whatever;

}).catch(function(err){

   alert(JSON.stringify(err));

})

答案 2 :(得分:0)

angular.module('my.services').factory('Properties', function ($http) {
  var properties = $http.get("/properties");

  return {
    get: function (property) {   
      properties.then(function(data) {
        return data[property];
      });
    }
  }
});

Haven没有对它进行过测试,但我想象的是'属性'是返回数据的关键。