如何从服务中读取控制器内$ http请求的数据?

时间:2015-09-23 22:19:41

标签: ajax angularjs http service

我试图在我的控制器中保存$ http服务的返回值,但我得到了#34; undefined"喜欢回应

在我的控制器中,我调用了一个使用$ http:

的服务
//this returns undefined
vm.user_instruments = instruments.getInstruments();

我的服务:

function instruments($http){
       this.getInstruments = function(){
         $http.get('url/').
          then(function(response) {
            /*this console.log print the response, 
            but this value I can't get it in my controller*/
            console.log(response.data);
            return response.data;
          }, function(error) {
            return error.data;
          });
       }
     }//end service

那么,我做错了什么?我的目的是控制器不知道HTTP的任何细节

3 个答案:

答案 0 :(得分:1)

几个问题。首先,您的服务功能没有返回任何内容....从中返回$http

this.getInstruments = function(){
   // return the request promise
   return  $http.get('url/').
      then(function(response) {            
        return response.data;
      }, function(error) {
        return error.data;
      });
   }

然后在控制器中为promise回调分配范围:

instruments.getInstruments().then(function(data){
  vm.user_instruments = data
});

答案 1 :(得分:1)

您有两种选择:

1。将promise发送给控制器并使用控制器中的promise

function service ($http) {
    this.request = function () {
        return $http.request({ /*...*/ });
    };
}

function controller (service) {
    service.request().then(function (resp) {
        console.log(resp);
    });
}

2。发送回调服务并将数据返回给回调

function service ($http) {
    this.request = function (callback) {
        return $http.request({ /*...*/ }).then(function (resp) {
            callback(null, resp);
        }, function (err) {
            callback(err);
        });
    };
}

function controller (service) {
    service.request(function (err, resp) {
        if (err) return console.log(err);

        console.log(resp);
    });
}

流行的选择是使用promises,因此使用选项1:)

答案 2 :(得分:0)

试试这种方式

服务:

function instruments($http){
  this.get = function(callback){ 
       $http.get('/url').success(function(res){
            callback(res);
       });
    }
 } /* end service */

控制器:

instruments.get(function(res){
     vm.instruments = res;
});

它应该工作。 PS:输入手机。