2016-10-04 12 views
-1

私はjsonファイルから約100個のポストコードを郵便番号をループしてジオコードしようとしていますが、11個のポストコードの後に​​OVERY_QUERY_LIMITエラーで制限されています。私はジオコーダーを毎秒速すぎるようです。私はsetTimeoutを組み込んでみましたが、動作させることはできません。どのように私はプロセスを遅くすることができますか?Googleジオコーディングを遅延させるにはどうすればよいですか?

コード

<head> 
    <meta charset="UTF-8"> 
    <title>heatmap test</title> 

    <style> 
     html { 
      height: 100% 
     } 

     body { 
      height: 100%; 
      margin: 0; 
      padding: 0; 
      font-family: sans-serif; 
     } 

     #map-canvas { 
      height: 100% 
     } 
    </style> 
</head> 

<body> 
    <div id="map-canvas"></div> 

    <script src="https://maps.googleapis.com/maps/api/js"></script> 
    <script src="assets/gmaps.js"></script> 
    <script> 
     document.addEventListener("DOMContentLoaded", function (event) { 

       var getPostcodes = function() { 

        //json link 
        var json = "http://localhost/addresses.json/"; 

        var request = new XMLHttpRequest(); 
        request.open('GET', json, true); 

        request.onload = function() { 
         if (request.status >= 200 && request.status < 400) { 
          // Success! 
          var data = JSON.parse(request.responseText); 

          //GET POSTCODES IN ARRAY 
          var postcodesArray = []; 
          for (var i = 0; i < data.length; i++) { 
           postcodesArray.push(data[i].from_postcode); 
          } 

          //filter all falsey values from array 
          var postcodes = postcodesArray.filter(Boolean); 

          //creating object for inserting data 
          var testData = { 
           data: [] 
          }; 

          //GET LAT/LONG POSITIONS 
          //for loop to create geocode object for each postcode 
          for (var n = 0; n < postcodes.length; n++) { 

           setTimeout(function(){ 

           GMaps.geocode({ 
            address: postcodes[n], 
            callback: function (results, status) { 
             if (status == google.maps.GeocoderStatus.OK) { 
              var location = results[0].geometry.location; 

              var latitude = parseFloat(location.lat().toFixed(8)), 
               longitude = parseFloat(location.lng().toFixed(8)); 

//           pushing lat and long data to object 
              testData.data.push({ 
               lat: latitude, 
               lng: longitude 
              }); 
             } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 
              console.log("error"); 
             } 

            } 

           }); 

           }, 500); 
          } 

          console.log(testData); 
         } 
         else { 
          console.log("failed"); 
         } 
        }; 
        request.onerror = function() { 
         // There was a connection error of some sort 
        }; 
        request.send(); 
       } 

       getPostcodes(); 

      }); 
    </script> 
</body> 
+0

limisは毎秒50リクエストですが、これはウェブ用のものであれば複数のユーザーがブラウザから同時にそのコードを実行できるため、クライアント側でレート制限を行ってもなぜなら、ほとんどの人が、代わりにキューの代わりにこのサーバサイドを実行するからです。 – adeneo

+0

ummm ...一度ジオコードしてデータを保存しますか?ページが読み込まれるたびにそれらを行う意味がない – charlietfl

+0

ヒートマップでlat/lngを使用するためにこれをやっていますが、サーバー側で行うことをお勧めしますか?あなたはデータをどこに保管しますか? – Sai

答えて

1

SetTimeoutは、単にコードを遅らせ、そしてあなたは、タイムアウトに設定された遅延を与えてくれました。

すべての機能が500msを待っていて、すべてが即座に実行されます。あなたはどちらか何ができるか

はそうのような動的遅延持っている:

... 

for (var n = postcodes.length; n--;) { 
    setTimeout(function(){ 
     GMaps.geocode({ 
      ... 
     }) 
    }, 500 * n); 
} 

.... 

かのsetIntervalを使用しますが、上記のコードは、最高動作します。 setIntervalはあまり意味がありません。

+0

実際、ジオコーディングは非同期であるため、再帰関数が最も理にかなっています。 – adeneo

+1

彼の問題は、単純に2番目に多くのリクエストを開始することであり、非同期性はそれに関与しません。 –

+0

彼は彼が彼の応答を受け取った後にのみ要求を送ることを望んでいないと言っていません –

関連する問題