2

最大 10 個の住所をジオコーディングし、マップにマーカーを追加することができましたが、ジオコード (codeAddress) 関数の外でジオコードの結果にアクセスする必要があります。結果をグローバル変数配列 (userLat、userLng) にプッシュできると考えました。アラートを使用すると、ループによって実際に結果が関数内の配列に追加されますが、配列は関数の外では値がありません。

ちなみに、失敗したジオコーディングのアラートは、問題があった住所に応じて住所「i」を返す必要がありますが、ループの最後の住所値のみを表示します。

多分問題は関連していますか?ネストされた関数の理解不足と関係があるのではないかと思います。

これが明確であることを願っています。助けてくれてありがとう!

   function codeAddress() {

    var useradd = [];
    var geocoder = new google.maps.Geocoder();
    var howmany = parseFloat(document.getElementById("howmany").value);

    for (var i=0; i<howmany; i++) {
        useradd[i] = document.getElementById('address['+i+']').value;
        geocoder.geocode( {address: useradd[i]}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
                userLat.push(parseFloat(results[0].geometry.location.lat()));
                userLng.push(parseFloat(results[0].geometry.location.lng()));
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
            } 
            else {
                alert('Address ' + i + ' was not successfully located for the following reason: ' + status);
            }
        });
    };
}

編集:

正しく理解できたかどうかはわかりませんが、コールバック関数を抽出し、ジオコーダーによって呼び出される新しい関数を作成しました。ただし、問題は同じで、変数 userLat と userLng はループの外に持ち出されません。助言がありますか?

関数コードアドレス() {

function callBack() {
    return function(results, status){
        if (status == google.maps.GeocoderStatus.OK) {
        userLat.push(parseFloat(results[0].geometry.location.lat()));
        userLng.push(parseFloat(results[0].geometry.location.lng()));
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
        } 
        else {
            alert('Address ' + i + ' was not successfully located for the following reason: ' + status);
        }
    }
}    

    var userLat = [];
            var userLng = [];
    var useradd = [];
    var geocoder = new google.maps.Geocoder();
    var howmany = parseFloat(document.getElementById("howmany").value);

    for (var i=0; i<howmany; i++) {
        useradd[i] = document.getElementById('address['+i+']').value;
        geocoder.geocode({address: useradd[i]}, callBack());
    };
}
4

2 に答える 2

0

codeAddress関数が戻ったとき、geocoder.geocodeはまだその仕事をしていますが、これは非同期です。完了するgeocoder.geocodeと、無名関数として渡したコールバックが呼び出されます。

私が提案する解決策はcodeAddress、グローバル変数アプローチを使用する代わりに、コールバック関数を のパラメーターにし、そのコールバック (またはコールバック内で呼び出される他の関数) から必要なことを行うことです。

于 2012-11-28T12:27:15.967 に答える
0

Javascript のスコープがすべてです。関数外の変数にアクセスする場合は、関数スコープ外で変数を宣言および作成してから、それらを更新する必要があります。

関数スコープ外で宣言された変数は、スクリプト内の他の場所で使用できます。

 var def = "bombshell";
 function changer(){
     def = "changed value";
 }
 changer();
 alert(def);

こちらをご覧ください - http://jsfiddle.net/daveheward/kWn8b/

于 2012-11-28T12:29:16.807 に答える