簡體   English   中英

AngularJS承諾使用http處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM