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来返回值,它可以工作,但这将是一个糟糕的编程策略.
在控制器中使用服务的正确方法是:
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)