3

Google Places API 中有每秒查询限制,因此我需要减慢发送请求的循环:

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 * nn当前迭代编号在哪里)。

而且,更重要的是,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 回答