如何让$ q和$ http一起工作?

时间:2016-06-30 09:41:39

标签: javascript angularjs http

我想让这段代码正常工作

getDataObject = {
    transformData: function (wmsLayer) {
    var promise = this.getDataFromServer(wmsLayer);
    promise.then(
        function(XMLInput){
            layers = $(XMLInput).find('LayerDescription').each(function() {
                var item = $(this);
                var layerName = item.attr('name');
                layerNames.push(layerName);
            });       
            },
        function(data){
                this.error(data)
                });
},

getDataFromServer: function(wmsLayer) {
var deferred = $q.defer();
var layerGroup = wmsLayer.params.LAYERS[0];
    $http.get({
        url : '//localhost/geoserver/BL_WFS/wms',
        params : {
            service : 'WMS',
            version : '1.1.1',
            request : 'DescribeLayer',
            layers :  layerGroup,
        },
        responseType : 'xml'
    })
    .success(function(data){
        deferred.resolve(data);
    })
    .error(function(error){
        deferred.reject(error);
    });
return deferred.promise;        
}

但我遇到两个问题:

  1. 虽然我在$ http中设置了url,但该函数一直在调用页面来自的URL。

  2. 我想只在回复数据时执行transformData函数,我不确定我是否正确设计了promise / defer结构。

2 个答案:

答案 0 :(得分:2)

首先,你正在使用angulars的速记$ http.get。这个具有$ http.get(url,config)的函数签名,所以它应该是

$http.get('//localhost/geoserver/BL_WFS/wms', {
    params : {
        service : 'WMS',
        version : '1.1.1',
        request : 'DescribeLayer',
        layers :  layerGroup,
    },
    responseType : 'xml'
})

其次,$ http已经返回一个你可以使用的Promise对象,它会被自动解析或拒绝,所以你可以在这种情况下直接返回它。

来源https://docs.angularjs.org/api/ng/service/ $ http

编辑:保留角度文档并检查它是一个好主意。

答案 1 :(得分:1)

虽然@ SargoDarya的回答是正确的,但我想我已经澄清了如何更改代码。

改变这个:

getDataFromServer: function(wmsLayer) {
    var deferred = $q.defer();
    var layerGroup = wmsLayer.params.LAYERS[0];
    $http.get({
        url : '//localhost/geoserver/BL_WFS/wms',
        params : {
            service : 'WMS',
            version : '1.1.1',
            request : 'DescribeLayer',
            layers :  layerGroup,
        },
        responseType : 'xml'
    })
    .success(function(data){
        deferred.resolve(data);
    })
    .error(function(error){
        deferred.reject(error);
    });
    return deferred.promise;        
}

对此:

getDataFromServer: function(wmsLayer) {
    var layerGroup = wmsLayer.params.LAYERS[0];
    return $http.get('//localhost/geoserver/BL_WFS/wms', {
        params : {
            service : 'WMS',
            version : '1.1.1',
            request : 'DescribeLayer',
            layers :  layerGroup,
        },
        responseType : 'xml'
    });       
}

由于$http.get已经返回promise