我想让这段代码正常工作
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;
}
但我遇到两个问题:
虽然我在$ http中设置了url,但该函数一直在调用页面来自的URL。
我想只在回复数据时执行transformData
函数,我不确定我是否正确设计了promise / defer结构。
答案 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
。