0

誰かが私に次の動作を説明してもらえますか:

function getLatLong() 
    {
        var geocoder = new google.maps.Geocoder();
        var result = "";
        geocoder.geocode ( { 'address': "London", 'region': 'uk' }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
            result = results[0].geometry.location;
            alert('Im called second');
            } else {
               alert("Geocode was not successful for the following reason: " + status);
            }
        });

        alert('Im called first');  
        return result;
    }

最初の警告の前に、2 番目の警告メッセージがどのように呼び出されますか? 割り当てられた変数「result」の値に戻ろうとしているという問題がありますが、results[0].geometry.location から値が割り当てられているにもかかわらず、空の文字列として返されたままになります。ここで非常に明白な何かが欠けているという恐ろしい気持ちがあります:/

4

2 に答える 2

1

geocoder.geocode()は非同期メソッドです。つまり、ブロックせずにすぐに戻りますが、ジオコーディング呼び出し (おそらく Google のジオコーディング サービスへの呼び出し) が完了すると、指定された関数を実行します。

何が起こっているかとalert('Im called first')いうと、他の通話が完了する前に通話が呼び出されるということです。これは、ジオコーディングの呼び出しがインターネットを経由する必要があるためです。これら 2 つの呼び出しの順序は、ジオコーディングが完了するまでにかかる時間によって異なります。

これを解決するために、この関数から結果を返すことはできません。代わりに、ジオコーディングが完了したときにコールバックとして機能する関数を提供して、現在入力されている結果を使用できるようにする必要があります。

例えば

function getLatLong(completeCallback) 
{
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode ( { 'address': "London", 'region': 'uk' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var result = results[0].geometry.location;
            completeCallback(result);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
于 2012-08-13T22:34:17.140 に答える
1

o理由は、geocoder.geocode の呼び出しがコールバックを使用して結果を配信するためです。geocoder.geocode への呼び出しは、リクエストをジオコーダー サービスに送信するのに十分な時間だけ続き、実行は次の (非コールバック) 行、つまり「Im called first」アラートに続きます。コールバック内のすべてのコードは「後で使用するために保存」され、ジオコーダーの応答を受信したときに呼び出されます。

それに応じてコードを記述する必要があります。元の関数呼び出しから結果を返す代わりに、コールバック内で結果を取得し、そこから処理を続行する必要があります。これにより、JavaScript の制御フローを追跡するのが少し難しくなる可能性があります。

于 2012-08-13T22:36:56.823 に答える