2

使用goMapしていて、その中に関数を追加しようとしていますが、関数が呼び出されたときに関数を返すことができません。関数内で使用するalert()と、必要な値が返されます。

getAddress: function(latlngcoords)
{
    var goMap = this;
    var input = latlngcoords;
    var latlngStr = input.split(",", 2);
    var lat = parseFloat(latlngStr[0]);
    var lng = parseFloat(latlngStr[1]);
    var latlng = new google.maps.LatLng(lat, lng);
    var address;

    geocoder.geocode({'latLng': latlng}, function(results, status) 
    {
        if(status == google.maps.GeocoderStatus.OK) 
        {
            if(results) 
            {   
                address = results;
                //alert(address); <-- works but
            }
        }
    });

    return address; // won't return at all?
},

それは次のことによって呼び出されます:$.goMap.getAddress()しかし、引数には緯度と経度が含まれます。で値を返すために必要ですが、return address何も返されません。

どうすれば値を返すことができますか?

4

1 に答える 1

3

geocode非同期関数です。それはあなたがそれを呼ぶときに始まります、しかしそれはすべてです。(これがコールバックを受け入れる理由です。)したがって、関数がコールバックによって設定されるgetAddress前に戻ってきます。address

getAddress関数にコールバックも受け入れさせ、その方法で結果を返す必要があります。たとえば、

getAddress: function(latlngcoords, callback)
                                // ^--- callback parameter
{
    var goMap = this;
    var input = latlngcoords;
    var latlngStr = input.split(",", 2);
    var lat = parseFloat(latlngStr[0]);
    var lng = parseFloat(latlngStr[1]);
    var latlng = new google.maps.LatLng(lat, lng);
    var address;

    geocoder.geocode({'latLng': latlng}, function(results, status) 
    {
        if(status == google.maps.GeocoderStatus.OK) 
        {
            if(results) 
            {   
                address = results;
                callback(address);
            //  ^--- call it with the result
            }
        }
    });
},

当然、これは、コード呼び出し が非同期getAddressであるという事実を処理する必要があることを意味します。getAddress

于 2011-04-08T13:54:02.430 に答える