2017-01-12 3 views
0

したがって、配列から都市を取得するスクリプトをテストしています。次に、ジオコードを使用して座標を検索し、その後に都市のジップを取得します。 1つの都市でOKですが、配列では、geoCodeにはクエリの制限がありますので、setTimeoutを使用してバイパスしようとしていますが、jsではまだ驚くにはほど遠いため、うまく機能しません。 settimeoutを使用してジオコードクエリ制限をバイパスする

<head> 
    <div id= "test"></div> 
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 

    <script type="text/javascript"> 

    function getLoc(){ 
     var geocoder = new google.maps.Geocoder(); 
     var address = ["Helsinki", "Paris", "London"]; 
     for (var i = 0; i < address.length; i++) { 
      setTimeout(function(i){ 
      geocoder.geocode({ 'address': address[i]}, function (results, status) {  
      if (status == google.maps.GeocoderStatus.OK) { 
       var lat = results[0].geometry.location.lat(); 
       var long = results[0].geometry.location.lng(); 
       alert(long); 
       getZip(lat, long); 

       } 
      }); 
      }, i* 1000); 
     } 
     } 
     getLoc(); 
    function getZip(lat, long){ 
     var latlng = new google.maps.LatLng(lat, long); 
     geocoder.geocode({ 
     'latLng': latlng 
     }, function(results, status) { 
      address = results[0].address_components; 
      zipcode = address[address.length - 1].long_name; 
      document.getElementById("test").innerHTML = zipcode; 
     }); 
    } 
</script> 
</head> 
<body> 

</body> 

+0

から常に値を持っています最後の都市「ロンドン」? –

+0

timeoutは機能しますが、最初のジオコード要求を処理しません。 – Skyhigh17

+0

使用例やデータセットのサイズはわかりませんが、バックグラウンドでデータを取得するサーバー側のcronジョブを作成することを検討してください適切なスロットル)、データベースに格納します。 APIの制限がリアルタイムバッチ処理には低すぎるため、クライアントに意図的な遅延を追加すると訪問者が不満になる可能性があります。 –

答えて

3
for (var i = 0; i < address.length; i++) { 
(function(i){ 
    setTimeout(function(i){ 
    geocoder.geocode({ 'address': address[i]}, function (results, status) { if (status == google.maps.GeocoderStatus.OK) { var lat = results[0].geometry.location.lat(); var long = results[0].geometry.location.lng(); alert(long); getZip(lat, long); } }); 
    }, i* 1000); 
    })(i); 
} 

ループのためのザ・タイムアウトは、火の前に終了します。だから、私は常にadress.length - 1すべてのタイムアウトになります。あなたはIIFEを使ってすべてのタイムアウトスコープにiを格納する必要があります(SOの 'forループのタイムアウト'を見ているかもしれません)

@wrestledabearonceが指摘したように、タイムアウトを使用するのはエレガントな方法ではありません。一度に複数のオープン要求を使用することもできますし、次々に使用することもできます。最初のものはタイムアウトが必要ではなく、2番目のものは再帰関数がより洗練されたソリューションです。

3

あなたは、たとえば、閉鎖機能であなたのsetTimeoutを巻きつける必要があります。

for (var i = 0; i < address.length; i++) { 
    (function(i){ 
     setTimeout(function(i){ 
      geocoder.geocode({ 'address': address[i]}, function (results, status) {  
       if (status == google.maps.GeocoderStatus.OK) { 
        var lat = results[0].geometry.location.lat(); 
        var long = results[0].geometry.location.lng(); 
        alert(long); 
        getZip(lat, long); 

       } 
      }); 
     }, i* 1000); 
    })(i); 
} 

閉鎖せずに、あなたのisetTimeoutでの意志が、私はあなたのために緯度と長い見ていると信じて最後for反復

+0

なぜ誰かがこの答えをマイナスしましたか? –

+0

いいえ、私はまだそれを試す時間がなかった。 – Skyhigh17

+0

私はこの答えとそれ以上のものが私自身の答えで間違っている理由を説明しました。質問は、なぜ誰かが間違った答えをupvoteしたのですか? –

関連する問題