1

我正在做一个应用程序,我必须对每个请求的几百个项目进行地理编码。所以非常天真我只是做了一个调用谷歌地图地理编码API的for循环。发生的情况是我的代码在很短的时间内对 API 进行了太多调用,因此在 5-10 次迭代后,地理编码 API 只会以OVER_QUERY_LIMIT限制回答。参考 Google API 参考,发生这种情况是因为:

网页在太短的时间内超过了请求限制。

我的循环目前是这样的:

for (var i = 0; i < dict.nodes.length; i++) {
    (function (i) {
        g.geocode({'address': dict.nodes[i].location}, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                dict.nodes[i]["geocoded_location"] = results
            }
        })
    })(i);
}

如何实现类似 sleep() 函数来随机延迟地理编码函数的调用以避免 API 限制。我实现了一个愚蠢的while循环,但它也让CPU哭了。有任何想法吗?

4

2 回答 2

4

为什么不只使用一个简单的setInterval,将其设置为每 100 毫秒或其他什么?

var i = 0;

var setAPI = setInterval( function () { 

    if ( i < dict.nodes.length ) {
        g.geocode({'address': dict.nodes[i].location}, function (results, status) {
             if (status == google.maps.GeocoderStatus.OK) {
                dict.nodes[i]["geocoded_location"] = results
             }
        });
    }

    i++;

  }, 
100); //100ms delay

现在您可以在任何时候:clearInvterval(setAPI);阻止它运行。

Engineer这与使用 setTimeout 并调用所指出的函数非常相似。

于 2012-07-27T15:05:16.937 回答
2

你可以实现这样的东西,而不是for循环:

(function nextCall(i){
    if(i < dict.nodes.length){
        g.geocode({'address': dict.nodes[i].location}, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                dict.nodes[i]["geocoded_location"] = results;
            }
        });
        setTimeout(function(){   nextCall(i+1)   },100);
    }
})(0);

当然,如果'100'延迟超过限制,你可以增加它。

于 2012-07-27T15:10:52.950 回答