Angular HTTP promise返回空

Dav*_*eto 1 javascript angularjs

我有一个带有HTTP GET请求的工厂,我使用promises作为文档说我应该使用$ q服务,但它返回一个空的承诺:

App.factory('dataFactory', ['$rootScope','$http','$q', function($rootScope,$http,$q) {

  // Objeto del factory 
  var fac = {};

  // Funcion que obtiene un mensaje completo
  fac.obtenerListaMensajes = function(compania,userhid){

    var deferred = $q.defer(); 

    $http({ 
            method: 'GET', 
            url: urlListaMensajes, 
            params: {company:compania,userhid:userhid}
          }).
      then(function(response) {

        deferred.resolve(response.data.messages);

        console.log(JSON.stringify(deferred.promise));

        }, function(error) {
          deferred.reject(error);
    });

    return deferred.promise;
  };

  return fac;

}]);
Run Code Online (Sandbox Code Playgroud)

控制器:

App.controller('MailFolderController', ['$scope','$rootScope','dataFactory', '$stateParams', function($scope, $rootScope, dataFactory, $stateParams) {

  // Variables de PRUEBA
  var user_prueba = 'MTQzMjU4NjUyNDcxMzczNzQwNjE3MTg1ODMxMDY5OTQ2';
  var company_prueba = 'development';

  $scope.mails = dataFactory.obtenerListaMensajes(company_prueba,user_prueba);
}]);
Run Code Online (Sandbox Code Playgroud)

$ scope.mails中的最终值是:

{"$$state":{"status":0}}
Run Code Online (Sandbox Code Playgroud)

我知道由于其中的console.log,HTTP请求正常工作.

我究竟做错了什么?我可以使用$ rootScope来返回值,它可以工作,但这将是一个糟糕的编程策略.

dfs*_*fsq 5

在控制器中使用服务的正确方法是:

dataFactory.obtenerListaMensajes(company_prueba, user_prueba).then(function(data) {
    $scope.mails = data;
});
Run Code Online (Sandbox Code Playgroud)

你也可以通过去除多余的虚拟延迟对象来改善服务,你不需要它,因为$http已经返回了promise:

App.factory('dataFactory', ['$rootScope', '$http', '$q', function ($rootScope, $http, $q) {

    // Objeto del factory 
    var fac = {};

    // Funcion que obtiene un mensaje completo
    fac.obtenerListaMensajes = function (compania, userhid) {
        return $http({
            method: 'GET',
            url: urlListaMensajes,
            params: {
                company: compania,
                userhid: userhid
            }
        }).
        then(function (response) {
            return response.data.messages;
        });
    };

    return fac;

}]);
Run Code Online (Sandbox Code Playgroud)