как замедлить цикл javascript
Я хотел бы добавить 1-2 секундной задержкой на каждой итерации следующего цикла.
<html>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<input id="start" type="submit"> </input>
<div id='status'></div>
<script>
var geocoder=new google.maps.Geocoder();
var glGeocodeCount = 0 ;
$(document).ready(function() {
$('#start').click(function() {
//srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");
for(x=0;x<20;x++){
srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");
}
return false;
});
});
function srPerformGeocode(address){
if (geocoder){
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK){
$('#status').prepend("Success : " + address + "<br/>");
}
else{
$('#status').prepend("Failed : " + address + "<br/>");
}
});
}
}
</script>
4 ответов
Вы можете сделать это таким образом с setTimeout()
:
$(document).ready(function() {
$('#start').click(function() {
//srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");
var x = 0;
function go() {
srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");
if (x++ < 20) {
setTimeout(go, 2000);
}
}
go();
return false;
});
});
Это заставляет меня задуматься, почему вы делаете поиск геокода по тому же адресу 20 раз подряд?
вы, вероятно, хотите использовать таймер для этого. Если бы вы просто поместили цикл задержки в код, результатом было бы только то, что код занимает больше времени, но конечный результат появится сразу после завершения кода.
можно использовать методы setTimeout или setInterval. Пример:
function(){
var instructions = [
function() { /* do something */ },
function() { /* do something */ },
function() { /* do something */ },
function() { /* do something */ }
];
var index = 0;
var handle = window.setInterval(function() {
if (index < instructions.length) {
instructions[index++]();
} else {
window.clearInterval(handle);
}
}, 10);
}();
Я рекомендую избавиться от цикла и использовать setTimeout:
$('#start').click(function() {
var i = 0, max = 20, delay = 2000, run;
run = function(){
srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");
if(i++ < max){
setTimeout(run, delay);
}
}
run();
return false;
});
у меня такое чувство, что вы не хотите начинать следующую итерацию цикла, пока поиск геокода не будет действительно завершен. Итак, ключевое слово здесь "callback":
вместо for...
выполните ниже. Я знаю, что это может быть не то, к чему вы привыкли, но, пожалуйста, попытайтесь понять это (это должно работать).
var dogeo = function(callback)
{
srPerformGeocode("address", callback);
};
var counter = 0;
var geoCallback = function()
{
counter++;
if(counter < 20)
{
dogeo(geoCallback);
}
};
dogeo(geoCallback);
function srPerformGeocode(address, callback){
if (geocoder){
geocoder.geocode({ 'address': address }, function (results, status) {
// this function is a callback of geocode()
if (status == google.maps.GeocoderStatus.OK){
$('#status').prepend("Success : " + address + "<br/>");
}
else{
$('#status').prepend("Failed : " + address + "<br/>");
}
callback(); // let the caller know this is done
});
}
}