2015-10-20 15 views
6

Tôi đang cố tạo một hàm sẽ tạo một điểm đánh dấu mới. Tôi cần để có thể xử lý một số thuộc tính của điểm đánh dấu mới trong cuộc gọi lại. Vấn đề là được tạo ngay lập tức và có thể được sử dụng để gọi hàm gọi lại, nhưng một số thuộc tính chưa có sẵn.Làm cách nào để chờ một đối tượng được tạo không đồng bộ hoàn toàn có sẵn trước khi gọi lại một cuộc gọi lại?

Nếu tôi đợi hai giây trước khi thử truy cập các thuộc tính, nó hoạt động tốt - điều này dẫn tôi tin rằng đối tượng vẫn tạo ra chính nó một cách không đồng bộ sau khi được tạo.

<!DOCTYPE html> 
<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <title>Simple markers</title> 
    <style> 
     html, body { 
     height: 100%; 
     margin: 0; 
     padding: 0; 
     } 
     #map { 
     height: 100%; 
     } 
    </style> 
    </head> 
    <body> 
    <div id="map"></div> 
    <script> 

function initMap() { 
    var latLng = new google.maps.LatLng(-25.363, 131.044); 

    var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 4, 
    center: latLng 
    }); 

    function placeMarker(map, latLng, callback, callback2){ 
     var marker = new google.maps.Marker({ 
      position: latLng, 
      map: map }); 

     callback(marker); 
     callback2(marker); 
    } 

    placeMarker(map, latLng, function(marker){ 
     setTimeout(function(){ 
      console.log(marker.Xg.Oa) 
     }, 2000); 
    }, function(marker){ 
     console.log(marker.Xg.Oa); 
    }); 

} 
    </script> 
    <script async defer 
     src="https://maps.googleapis.com/maps/api/js?signed_in=true&callback=initMap"></script> 
    </body> 
</html> 

Trong ví dụ này gọi lại:

setTimeout(function(){ 
    console.log(marker.Xg.Oa) 
}, 2000); 

mang lại câu trả lời đúng. Tuy nhiên, cuộc gọi lại không chờ đợi hiển thị lỗi không xác định:

function(marker){ 
    console.log(marker.Xg.Oa); 
} 

Tôi đang sử dụng thư viện API Javascript của Google Maps ở đây và gây rối với công cụ google.maps không phải là một lựa chọn vì lý do hiển nhiên. Tôi muốn vượt qua toàn bộ đối tượng để gọi lại nhưng tôi cần đảm bảo rằng thông tin latLng (marker.Xg.Oa) tồn tại trước khi gọi nó. Làm thế nào tôi có thể đảm bảo rằng nó ở đó trước khi gọi lại gọi lại?

+1

Tôi có loại một khó tin này _isn't_ một bản sao, nhưng đối với cuộc sống của tôi, tôi không thể tìm thấy một. – HPierce

+4

Bạn có biết gì về lời hứa không? Sẽ thêm một câu trả lời có thể giúp ... – AdamJeffers

+0

Tôi biết _of_ họ, nhưng theo như tôi biết họ không phải là một phần của vanilla JS (mà sẽ là thích hợp hơn). Tôi mở để sử dụng chúng nếu đó là những gì cần thiết. – HPierce

Trả lời

7

NB: Tôi đã không kiểm tra này, nhưng một cái gì đó dọc theo những dòng ...

var map = //... 
var latLng = //... 

function placeMarker(map, latLng, callback){ 

    return new Promise(function(resolve, reject)(){ 

     getMarker().then(function(marker){ 
      //The marker is immediately available 
      console.log(marker); //me {__gm: Object, ... } 

      //Try to get the value we need 
      console.log(marker.Xg.Oa); //Uncaught TypeError: Cannot read property 'Oa' of undefined 

      //wait two seconds and try again 
      setTimeout(function(){ console.log(marker.Xg.Oa) }, 2000); // L {} (this is the expected output) 

      while(!marker.Xg.Oa){ //Uncaught TypeError: Cannot read property 'Oa' of undefined 
       callback(marker.Xg.Oa); 
      } 

      resolve(true); 
     }); 
    }); 

} 

function getMarker() 
{ 
    return new Promise(function(resolve, reject){ 
     var marker = new google.maps.Marker({ 
      position: latLng, 
      map: map 
     }); 

     resolve(marker); 
    }); 
} 
+0

Tôi đã chỉnh sửa câu hỏi để tạo một ví dụ có thể kiểm tra hơn. Nhưng tôi nghi ngờ đây là hướng tôi sẽ hướng tới. – HPierce

+1

[Sau một meta thảo luận] (http://meta.stackoverflow.com/questions/308444/ive-asked-an-xy-question-what-should-i-do-with-it) - Tôi chấp nhận điều này câu trả lời vì nó thực sự đề cập đến câu hỏi mà tôi đã hỏi - nhưng cần lưu ý (tôi sẽ đánh giá cao nếu bạn đã chỉnh sửa câu trả lời) rằng dựa trên thực tiễn xấu truy cập vào các đối tượng bản đồ google theo cách kém. – HPierce

+0

Điểm hợp lệ ... hãy để nó với tôi! – AdamJeffers

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