5

文字列のジオコーディングを返す JavaScript 関数があります。

    function codeAddress(address) {
    var result = (new google.maps.Geocoder()).geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        return String(results[0].geometry.location.Ya)+','+String(results[0].geometry.location.Za)
      } else {
        return status;
      }
    });
    console.log(result);
    return result
}

ただし、「未定義」が返されます。ここでバグを理解しています。つまり、javascript は非同期であるため、完全に実行されるcodeAddress前であっても関数から返されます。function(results, status)しかし、ここでの解決策とベストプラクティスを知る必要があります。

4

1 に答える 1

11

非同期であるため、関数を処理するコールバックを渡す必要があります。

function codeAddress(address, callback) {
    (new google.maps.Geocoder()).geocode({
        'address' : address
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            callback(String(results[0].geometry.location.Ya) + ','
                    + String(results[0].geometry.location.Za))
        } else {
            callback(status);
        }
    });
}

codeAddress("test", function(result) {
    // do stuff with result
});

jQuery を使用している場合は、deferred も使用できます。

function codeAddress(address, callback) {
    var dfd = new jQuery.Deferred();

    (new google.maps.Geocoder()).geocode({
        'address' : address
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
             // trigger success
            dfd.resolve(String(results[0].geometry.location.Ya) + ','
                    + String(results[0].geometry.location.Za));
        } else {
            // trigger failure
            dfd.reject(status); 
        }
    });

    return dfd;
}

codeAddress("some address").then(
    // success
    function(result) {
        // do stuff with result
    },
    // failure
    function(statusCode) {
        // handle failure
    }
);
于 2012-11-19T14:31:26.353 に答える