3

Google Places API には 1 秒あたりのクエリ制限があるため、リクエストを送信するループを遅くする必要があります。

function callback(results, status) {
  if (status != google.maps.places.PlacesServiceStatus.OK) {
    alert(status);
    return;
  }
      for (var i = 0, result; result = results[i]; i++) {
    RequestInfo(result);
  }
}

どうすればそれを行うことができますか?私は少し初心者です。

4

3 に答える 3

4

再帰的なソリューション、

function requestInfoWrapper(results, i) {
    i = i + 1;
    if (i >= results.length) {return};
    requestInfo(results[i]);
    setTimeout(function() {requestInfoWrapper(results, i);}, 1000);
}

それをテストするためのいくつかのサンプルコード、

   var results = ["test 1", "test 2", "test 3"];
   function requestInfo(str) {console.log(str);}
   requestInfoWrapper(results, -1);

また、コードと統合されるのは、

function callback(results, status) {
    if (status != google.maps.places.PlacesServiceStatus.OK) {
        alert(status);
        return;
    }

    requestInfoWrapper(results, -1);
}
于 2013-08-28T20:09:50.903 に答える
2
for (var i = 0, result; result = results[i]; i++){
    (function(result){
        setTimeout(function(){
            RequestInfo(result);
        }, 1e3 * i);
    })(result);
}

それらを使用setTimeoutして間隔を空けて実行することができます(現在の反復番号は1 second * nどこですか)。n

そして、より的確な答えとして、JavaScript には「スリープ」メソッドがありません (また、そうしたくはないでしょう。それはシングル スレッドであり、待機中に他のものを拘束します)。

于 2013-08-28T19:57:40.527 に答える
1

setTimeout を使用して、関数を再帰的に呼び出すことができます。

var i = 0;
function callback(results, status) {
  if (status != google.maps.places.PlacesServiceStatus.OK) {
    alert(status);
    return;
  }
  setTimeout(function() { 
    i++; 
    if (i < results.length) { 
      RequestInfo(results[i]);
      callback(results, status);
    }
  }, 1000);
}
于 2013-08-28T20:04:02.143 に答える