使用服务输出到控制器

时间:2016-04-02 14:07:01

标签: javascript angularjs angularjs-service angular-promise angularjs-http

我希望将我的$ http.get从我的服务转移到我的控制器。

myserviceSample.js

  function messagesService($q,$http){
    var messages;
    $http({
      method: 'GET',
      url: 'http://api.com/feedback/list'
    })
    .then(function success(response){

      messages = response.data;
      console.log(messages);
    },function error(response){
      console.log('error'+ response);
    });
    console.log(messages);

    return {
      loadAllItems : function() {
        return $q.when(messages);
      }
    };
  }

})();

mycontrollerSample.js

  function MessagesController(messagesService) {
    var vm = this;

    vm.messages = [];

    messagesService
      .loadAllItems()
      .then(function(messages) {
        console.log(messages);
        vm.messages = [].concat(messages);
      });
  } 
})();

上面的代码结果给出了未定义的输出。 我想念的是什么?

1 个答案:

答案 0 :(得分:3)

$q.when对象确实期望promise/object使其正常工作。在您的情况下,您必须在promise调用时将$q.when对象传递给$http.get。此处messages对象不具有$http.get的承诺,因此您可以更改方法的实现,如下所示。

<强>服务

function messagesService($q,$http){
    var messages = $http({
      method: 'GET',
      url: 'http://api.com/feedback/list'
    })
    .then(function success(response){
       return response.data;
    },function error(response){
       return $q.reject('Error Occured.');
    });

    return {
      loadAllItems : function() {
        return $q.when(messages);
      }
    };
}

然后控制器将解决这个承诺&amp; .then会做到这一点

function MessagesController(messagesService) {
    var vm = this;
    vm.messages = [];
    messagesService
      .loadAllItems()
      .then(function(messages) {
        console.log(messages);
        vm.messages = [].concat(messages);
      });
} 
  

注意:使用$q创建自定义承诺,当您拥有$http.get方法时,会将其视为错误模式   承诺自己)

改进实施

function messagesService($q, $http) {
  var messages, getList = function() {
    return $http({
      method: 'GET',
      url: 'http://api.com/feedback/list'
    })
    .then(function success(response) {
      messages = response.data
      return response.data;
    }, function error(response) {
      return $q.reject('Error Occured.');
    });
  };

  return {
    loadAllItems: function() {
      if (!data)
        return getList(); //return promise
      else
        return $q.resolve(messages); //return data
    }
  };
};