【问题标题】:Use output from services to controllers使用服务的输出到控制器
【发布时间】:2016-07-22 07:40:56
【问题描述】:

我希望我的 $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);
      });
  } 
})();

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

【问题讨论】:

  • 只是对您准备服务的方式发表评论。当服务被实例化时,您似乎正在调用检索反馈/列表。我认为这很糟糕,应该在请求信息时进行调用,即调用 loadAllItems 时。此外,我将从返回对象中删除函数包装器,并将所有功能放在一个名为 loadAllItems 的函数中。

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


【解决方案1】:

$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);
      }
    };
}

然后控制器将解决该承诺,.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
    }
  };
};

【讨论】:

  • @artemist 看看代码的更新版本..很高兴帮助你..谢谢:)
猜你喜欢
  • 2012-12-26
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多