2010-06-07 17 views
26

Tôi đang làm việc với API bản đồ google và bất cứ khi nào tôi trả lại biến cho hàm khởi tạo từ hàm codeLatLng, nó tuyên bố không xác định. Nếu tôi in biến từ codeLatLng nó sẽ hiển thị tốt.Làm cách nào để tôi trả lại biến từ cuộc gọi lại bộ mã hóa địa lý JavaScript của Google Maps?

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    var addr = codeLatLng(); 
    document.write(addr); 

    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       return results[1].formatted_address; 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

in ra không xác định

Nếu tôi làm:

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(); 


    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.write(results[1].formatted_address); 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

in ra New York, NY 10012, USA

Trả lời

44

Bạn không thể trả về giá trị từ chức năng, giá trị chưa hề tồn tại khi chức năng trả về.

Phương pháp geocode thực hiện cuộc gọi không đồng bộ và sử dụng một callback để xử lý kết quả, vì vậy bạn phải làm như vậy trong codeLatLng chức năng:

var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(function(addr){ 
    alert(addr); 
    }); 
} 

function codeLatLng(callback) { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 
+0

is it có thể trả về giá trị của addr? làm thế nào tôi nên gán addr cho một biến? – AbtPst

+0

@AbtPst: Bạn không thể trả lại bất cứ điều gì từ kết quả trong một cuộc gọi không đồng bộ, khi cuộc gọi trả về trước khi có kết quả. Nơi tôi đặt 'alert (addr);' là nơi bạn có thể sử dụng kết quả.Có thể gán giá trị cho biến toàn cầu ở đó, nhưng sau đó bạn sẽ vẫn phải chờ giá trị đến. – Guffa

+0

vâng, điều đó sẽ ổn thôi. thực ra tôi có một dãy giá trị dài lat. tôi muốn xử lý mảng lặp và tiếp tục thêm địa chỉ vào danh sách. bằng cách này, có cách nào để đảo ngược mã địa lý một mảng các giá trị lat lon cùng một lúc không? và làm thế nào để tôi gán addr cho một biến toàn cầu? tôi chỉ có thể làm x = addr bên trong chức năng? – AbtPst

-2

trở lại đó không trở về từ codeLatLng; nó trở về từ hàm ẩn danh đang được chuyển đến geocoder.geocode.

Tôi nghĩ bạn cần chuyển dữ liệu bằng cơ chế khác, ví dụ: biến toàn cầu

0

chuyển bộ mã hóa địa lý làm tham số cho hàm codeLatLng().

function codeLatLng(geocoder) { 

gọi nó như vậy trong chức năng khởi tạo của bạn:

var addr = codeLatLng(geocoder); 
11

Bạn đang làm cho một yêu cầu không đồng bộ, chức năng codeLatLng() của bạn đã kết thúc và quay trở lại rất lâu trước khi geocoder được thực hiện.

Nếu bạn cần dữ liệu geocoder để tiếp tục, bạn sẽ phải chuỗi chức năng của bạn với nhau:

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    codeLatLng(); 
} 
function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         initContinued(results[1].formatted_address); 
        } else { 
         alert("No results found"); 
        } 
       } else { 
        alert("Geocoder failed due to: " + status); 
       } 
     }); 
     } 

} 
function initContinued(addr) { 
    alert(addr); 
} 
1

Chức năng geocode sử dụng một callback (function(results, status) { ... }) là được gọi khi chức năng geocode hoàn thành công việc của nó. Vì vậy, khi bạn trả về một giá trị từ cuộc gọi lại này, nó chỉ trả về giá trị cho hàm geocode, không phải trong số codeLatLng.

Với điều này, bạn có nhiều lựa chọn: Định nghĩa một biến trong codeLatLng và đặt nó trong hàm callback, ví dụ:

function codeLatLng() 
{ 
    var returnValue; 
    geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); 
    return returnValue; 
} 

Hoặc làm những thứ bạn cần với kết quả trực tiếp trong hàm callback. Hoặc đặt kết quả trong một biến toàn cục. (Ngoài ra, nếu chức năng geocode là không đồng bộ - nếu nó trả về ngay lập tức và gọi lại được gọi sau đó, bạn cần phải thực hiện một trong hai lần cuối, bạn không thể trả về giá trị từ codeLatLng trong trường hợp đó.)

+1

Ví dụ mã của bạn không hoạt động. Khi biến được trả về, giá trị của nó không được đặt, vì điều đó xảy ra sau trong hàm gọi lại. Sử dụng biến toàn cầu hoạt động để trả về giá trị, nhưng vấn đề với điều đó là mã không nhận được bất kỳ tín hiệu nào khi giá trị có sẵn trong biến. Giá trị không có sẵn ngay lập tức sau khi hàm được gọi. – Guffa

+0

Đó là lý do tại sao tôi đã nói rằng nếu mã địa lý không đồng bộ (tôi không biết liệu đó có phải là) hay không, anh ta nên sử dụng hai phương thức khác, biến toàn cục hoặc thực hiện các công cụ trong gọi lại. Mặc dù tôi thừa nhận tôi đã không chỉ ra rằng với biến toàn cầu, ông sẽ không nhận được bất kỳ tín hiệu, vì vậy ông sẽ phải kiểm tra nó định kỳ. –

Các vấn đề liên quan