我正在尝试在textarea中创建XML格式的输出,但遇到了异步问题:
$(document).ready(function() {
var geocoder;
geocoder = new google.maps.Geocoder();
$('#xmloutput').val('<?xml version="1.0" encoding="UTF-8"?>\n<parent>\n');
var addresslist = 'one\ntwo\nthree';
var addlines = addresslist.split('\n');
$.each(addlines, function(name, value) {
geocoder.geocode( { 'address': value}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
$('#xmloutput').val($('#xmloutput').val()+'<node>'+value+'</node>\n');
}
});
});
$('#xmloutput').val($('#xmloutput').val()+'</parent>');
});
我想要这个输出:
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<node>one</node>
<node>two</node>
<node>three</node>
</parent>
但是我得到了这个输出,因为地理编码需要一段时间......
<?xml version="1.0" encoding="UTF-8"?>
<parent>
</parent><node>one</node>
<node>two</node>
<node>three</node>
我已经看过很多类似的帖子和修复标题是链接或回调,但我还没有设法让任何工作。我该怎么做呢?
谢谢! 本
答案 0 :(得分:2)
更改each
循环并在循环的最后一次传递中添加结束标记
/* first argument of `each` for an array is `index` which will increment on each pass*/
$.each(addlines, function(index,value) {
geocoder.geocode({
'address': value
}, function(results,status) {
if (status == google.maps.GeocoderStatus.OK) {
var newString=$('#xmloutput').val() + '<node>' + value + '</node>\n';
/* is this the last item? */
if (index == addlines.length-1) {
newString += '</parent>';
}
$('#xmloutput').val( newString)
}
});
});
由于服务调用的异步性,地理编码器仍然可以不按顺序返回值。如果发生这种情况,您可能需要创建所有结果的本地对象,并使用deffered检查在加载完整字符串之前收到的所有结果
答案 1 :(得分:0)
尝试使用.append()代码如下:
$(document).ready(function() {
var geocoder;
geocoder = new google.maps.Geocoder();
$('#xmloutput').val('<?xml version="1.0" encoding="UTF-8"?>\n<parent>\n');
var addresslist = 'one\ntwo\nthree';
var addlines = addresslist.split('\n');
$.each(addlines, function(name, value) {
geocoder.geocode( { 'address': value}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
$('#xmloutput').append('<node>'+value+'</node>\n');
}
});
});
$('#xmloutput').append('</parent>');
});