1

テキストエリアに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>

私は多くの同様の投稿を見てきました、そして修正は連鎖またはコールバックであるように見えます、しかし私はまだ何も機能させることができませんでした。これにどのようにアプローチすればよいですか?

ありがとう!ベン

4

2 に答える 2

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)
        }
    });

}); ​

サービスへの呼び出しの非同期性により、ジオコーダーがシーケンス外の値を返す可能性はあります。これが発生した場合は、すべての結果のローカルオブジェクトを作成し、遅延を使用して、完全な文字列をロードする前に受信したすべての結果を確認する必要があります。

于 2012-10-21T14:14:10.627 に答える
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>');
});
于 2012-10-21T14:10:10.137 に答える