[英]AngularJS promise handling with http
這是我正在努力的一段代碼-我有一個控制器(zmApp.MonitorCtrl),該控制器正在通過HTTP請求調用工廠(ZMFactory)。
我面臨的問題是:a)當控制器調用ZMFactory.getMonitors()時,它返回undef並出現錯誤ERROR:錯誤:undefined不是對象(評估'ZMFactory.getMonitors()。then')
b)出現此錯誤后,將處理工廠中的http請求
我有點困惑。 您能否檢查工廠是否正確設置以兌現承諾?
var app = angular.module('zmApp.controllers'); app.controller('zmApp.MonitorCtrl', function($ionicPlatform, $scope,$http,ZMFactory) { $scope.monitors=[]; console.log("***CALLING FACTORY"); ZMFactory.getMonitors().then(function(data) { $scope.monitors = data; console.log ("I GOT " +$scope.monitors); }); }); app.factory('ZMFactory',['$http', '$rootScope',function($http,$rootScope) { //var factory = {}; var monitors =[]; return { getMonitors: function() { console.log("***MAKING REQUEST"); $http({ url:'http://myurl.com:9999/zm/index.php?skin=xml', method:'post', headers: {'Content-Type': 'application/x-www-form-urlencoded', 'Accept': '*/*', }, transformRequest: function(obj) { var str = []; for(var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); var foo= str.join("&"); console.log ("****RETURNING "+foo); return foo; }, transformResponse: function(data) { var x2js = new X2JS(); var json = x2js.xml_str2json(data); console.log ("***Transmogrifying XML to JSON"); return json; }, data: {username:'xxx', password:'xxxx', action:'login', view:'console'} }) //http .success (function(data) { console.log("****YAY"+JSON.stringify(data)); var subobj =data.ZM_XML.MONITOR_LIST.MONITOR; var len = subobj.length; for (var i =0; i< len; i++) { console.log ("HERE " + subobj[i].NAME); monitors.push(subobj[i]); } // $rootScope.$broadcast ('handleZoneMinderMonitorsUpdate',monitors); return monitors; }) //success .error(function(data, status, headers, config) { console.log("***OOPS "+status + " H: "+data); return monitors; }); } //getMonitors };//return console.log ("**** NEVER *****"); }]);
答案的關鍵在於您自己問題的措辭:
您能檢查一下工廠是否正確設置以返回承諾嗎?
您需要return
。 現在,您的getMonitors
函數(如果我刪除與該問題無關的所有代碼)如下:
getMonitors: function(){
$http({})
.success(function(data){
// convert data to monitors
return monitors;
});
}
這是一個不返回任何內容的函數調用,或者返回undefined
。 沒有承諾的“魔術”-就像任何其他對象一樣,您需要將其返回給調用方。
因此,您需要做兩件事:
1)從變化.success
到.then
。 .then
生成一個新的鏈式承諾,該承諾在返回時將monitors
交付給使用者(您正在.then
處理程序中返回)。 另一方面, .success
返回原始的promise(由$http
生成),並且從.success
返回的數據丟失。
2)實際上return
$http
調用(或更確切地說,是$http().then()
調用)
從概念上講,這是什么樣的:
app.factory('ZMService', function ZMServiceFactory($http){
return {
// getMonitors function of the ZMService service
getMonitors: function(){
return $http({})
.then(function(response){
var data = response.data;
// convert data to monitors
return monitors;
});
}
};
});
(另請注意,我是如何將您的服務從ZMFactory
重命名為ZMService
。名稱中的“ factory”是用詞不當ZMService
是生成實例的函數-因此是“ factory”-但是實例本身是一個對象,在Angular中被稱為“服務”)
嘗試一下,在這里我按原樣返回承諾
var app = angular.module('zmApp.controllers');
app.controller('zmApp.MonitorCtrl', function($ionicPlatform, $scope,$http,ZMFactory)
{
$scope.monitors=[];
console.log("***CALLING FACTORY");
ZMFactory.getMonitors().then(function(data)
{
$scope.monitors = data;
console.log ("I GOT " +$scope.monitors);
});
});
app.factory('ZMFactory',['$http', '$rootScope',function($http,$rootScope)
{
//var factory = {};
var monitors =[];
return {
getMonitors: function()
{
return $http({
url:'http://myurl.com:9999/zm/index.php?skin=xml',
method:'post',
headers: {'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*/*',
},
transformRequest: function(obj) {
var str = [];
for(var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
var foo= str.join("&");
console.log ("****RETURNING "+foo);
return foo;
},
transformResponse: function(data)
{
var x2js = new X2JS();
var json = x2js.xml_str2json(data);
console.log ("***Transmogrifying XML to JSON");
return json;
},
data: {username:'xxx',
password:'xxxx',
action:'login',
view:'console'}
}) //http
.then(function(data)
{
console.log("****YAY"+JSON.stringify(data));
var subobj =data.ZM_XML.MONITOR_LIST.MONITOR;
var len = subobj.length;
for (var i =0; i< len; i++)
{
console.log ("HERE " + subobj[i].NAME);
monitors.push(subobj[i]);
}
// $rootScope.$broadcast ('handleZoneMinderMonitorsUpdate',monitors);
return monitors;
},function(error)
{
return error;
});
}
};
}]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.