Angular HTTP承诺返回空

Angular HTTP promise returns empty

本文关键字:返回 承诺 HTTP Angular      更新时间:2023-09-26

我有一个HTTP GET请求的工厂,我使用承诺作为文档说我应该,使用$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;
}]);

控制器:

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

$scope中的最终值。邮件是:

{"$$state":{"status":0}}

我知道一个事实,HTTP请求工作正常感谢它里面的console.log。

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

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

dataFactory.obtenerListaMensajes(company_prueba, user_prueba).then(function(data) {
    $scope.mails = data;
});

你也可以通过摆脱冗余的虚拟延迟对象来改善服务,你不需要它,因为$http已经返回承诺:

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