如何在函数中暂停Javascript中的FOR循环?

时间:2013-08-28 19:55:38

标签: javascript google-places-api

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);
  }
}

知道我该怎么做吗?我有点新手。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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没有“睡眠”方法(你也不想要它;它是单线程的,并且在等待时会占用其他任何东西)。

答案 2 :(得分: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);
}