2017-08-19 18 views
-1
function btnClick() { 
    var geocoder = new google.maps.Geocoder(); 
    var truckName = []; 
    var addr = []; 
    var Grid_Table = document.getElementById('GridView1'); 
    var locations2 = [{lat: -42.7545, lng: 147.735, addres: "3", geoAddress: "waa", truckName: "MX4" }, 
         {lat: -43.7545, lng: 142.735, addres: "1", geoAddress: "waa", truckName: "MX5" }, 
         {lat: -44.7545, lng: 143.735, addres: "2", geoAddress: "waa", truckName: "MX8" }]; 
      for (var row = 1; row < Grid_Table.rows.length - 1; row++) { 
      truckName.push(Grid_Table.rows[row].cells[0].textContent); 
      var addr = Grid_Table.rows[row].cells[4].textContent; 
      geocoder.geocode({ 'address': addr }, function (results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
        var loc = results[0].geometry.location; 
        var latitude = loc.lat(); 
        var longitude = loc.lng(); 
        locations2.push({ lat: latitude, lng: longitude, addres: addr, geoAddress: results[0].formatted_address, truckName: truckName[row] }); 
       } // end if 
      }); // end geocoder 
    } // end for 
    document.cookie = "locations=" + JSON.stringify(locations2); 
} 

所以我的地图工作。但它只绘制前三个位置。我知道这是因为GeoCoding是异步的。但对于我的生活,我无法想象如何等待。我希望先完成所有GeoCoding,然后设置cookie。请帮忙。GeoCoding - 如何等待所有位置先解析,然后设置cookie

+1

'但它只是绘制第一个3 locations' - 这可能不是因为它是异步的,这可能是因为你可能会达到费率限制(每秒50) - 检查浏览器**开发人员**工具网络标签,看看谷歌是否告诉你减慢 –

+0

它只绘制硬编码的3。 – Michael

+0

哦,对了 - 对不起,没意识到你还没有公布密谋的代码 –

回答

0

如果您不需要担心的50客户端地理限速/秒 - 改变你的代码是相当小

我添加了一个名为其余变种,它被设置了预计地理编码请求数量

然后在地理编码回调,减量剩余0时,一切都过去了

// if btnClick is add to a submit button (in a form), like so 
submitButtonElement.addEventListener('click', btnClick); 
// or using jQuery something like 
$(submitButtonElement).on('click', btnClick); 
// or 
$(submitButtonElement).click(btnClick); 
// then you'll need to preventDefault to stop the form submitting 
function btnClick(e) { 
    e.preventDefault(); // only required if handling a submit button 
    var geocoder = new google.maps.Geocoder(); 
    var truckName =[]; 
    var addr = []; 
    var Grid_Table = document.getElementById('GridView1'); 
    var locations2 = [{ lat: -42.7545, lng: 147.735, addres: "3", geoAddress: "waa", truckName: "MX4" }, 
         { lat: -43.7545, lng: 142.735, addres: "1", geoAddress: "waa", truckName: "MX5" }, 
         { lat: -44.7545, lng: 143.735, addres: "2", geoAddress: "waa", truckName: "MX8" }]; 
    var remaining = Grid_Table.rows.length - 2; // how many requests are pending 
    for (var row = 1; row < Grid_Table.rows.length - 1; row++) { 
     truckName.push(Grid_Table.rows[row].cells[0].textContent); 
     var addr = Grid_Table.rows[row].cells[4].textContent; 
     geocoder.geocode({ 'address': addr }, function (results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       var loc = results[0].geometry.location; 
       var latitude = loc.lat(); 
       var longitude = loc.lng(); 
       locations2.push({ lat: latitude, lng: longitude, addres: addr, geoAddress: results[0].formatted_address, truckName: truckName[row] }); 
      } // end if 
      remaining -= 1; 
      if (remaining === 0) { 
       // ************* ALL DONE HERE ********************** 
       document.cookie = "locations=" + JSON.stringify(locations2); 
       // all done here - any other code should be here, or in a function called from here 
      } 
     }); // end geocoder 
    } // end for 
} 
+0

看起来我的网页在通话结束前正在重新加载自己。明天我会再玩一次。谢谢。 – Michael

+0

是否将buttonclick添加到提交按钮?你需要添加一个preventDefault()调用 –

+0

@Michael - 在提交按钮的情况下添加的代码 –