2012-02-01 48 views
7

Tôi muốn thêm thời gian trễ 1-2 giây vào mỗi lần lặp của vòng lặp sau.cách làm chậm vòng lặp javascript

<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> 
+0

Tại sao bạn mã hóa địa lý cùng một địa chỉ 20 lần? – ceejayoz

+0

làm ví dụ. Tôi lưu ý rằng một số nhà cung cấp của API (như google) không thích bạn đập quá một cách khó chịu trên cửa của họ. Tôi muốn giảm tần số của cuộc gọi bằng cách sử dụng bộ đếm thời gian, nhưng đang gặp sự cố khi sử dụng nó trong vòng lặp, –

+0

Đó là sự thật, nhưng tại sao bạn sẽ đập trên cửa của họ với cùng một yêu cầu mỗi lần? – ceejayoz

Trả lời

11

Bạn có thể làm theo cách này với 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; 
    });   
}); 

này làm cho tôi tự hỏi tại sao bạn đang làm một tra cứu mã địa lý trên cùng một địa chỉ chính xác 20 lần liên tiếp?

+0

mr friend - xin vui lòng xem ở trên –

4

Có thể bạn muốn sử dụng bộ hẹn giờ cho việc này. Nếu bạn chỉ cần đặt một vòng lặp chậm trễ trong mã, kết quả sẽ chỉ là mã mất nhiều thời gian hơn để chạy, nhưng kết quả cuối cùng sẽ hiển thị tất cả cùng một lúc sau khi mã đã kết thúc.

Bạn có thể sử dụng các phương thức setTimeout hoặc setInterval. Ví dụ:

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

}(); 
0

tôi khuyến khích việc thoát khỏi vòng lặp và sử dụng 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; 
    }); 
0

tôi có cảm giác bạn không muốn để bắt đầu vòng lặp tiếp theo lặp cho đến khi tra cứu mã địa lý là thực sự hoàn chỉnh. Vì vậy, từ khóa có "gọi lại":

thay vì for..., hãy làm như bên dưới. Tôi biết nó có thể không phải là một cái gì đó bạn đang sử dụng để, nhưng hãy cố gắng nắm bắt nó (nó sẽ làm việc).

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

Tạm dừng bằng cách sử dụng setTimeout/setInterval tất cả có thể làm việc cho bạn, nhưng đó là một ảo tưởng. Nếu tôi có thể đọc mã của bạn một cách chính xác, vấn đề ban đầu là vòng lặp của bạn nhanh hơn geocoder.geocode trả về mỗi lần. Vì vậy, cách duy nhất để không có các cuộc gọi mã hóa địa lý song song sẽ là đợi cho đến khi một cuộc gọi được thực hiện trước khi một cuộc gọi tiếp theo được bắt đầu. Điều đó nói rằng, không cần phải tiếp tục làm chậm vòng lặp - nếu tất cả những gì bạn đang cố gắng tránh là các cuộc gọi song song. Nếu bạn vẫn muốn tạm dừng giữa các cuộc gọi, bạn vẫn nên sử dụng các cuộc gọi lại kết hợp với setTimeout. –

+0

Có, tôi muốn tránh các cuộc gọi song song cũng như làm chậm vòng lặp. Có vẻ như không có cách nào để làm cho google api hành động đồng bộ vì vậy tôi phải ngăn xếp mọi thứ vào cuộc đấu giá thành công của họ. Tôi sẽ cố gắng hiểu mã của bạn ... –

+0

ở trên loại bỏ các cuộc gọi song song; để tạm dừng giữa các cuộc gọi, hãy thực hiện điều này: 'if (counter <20) { window.setTimeout (function() { dogeo (geoCallback); } }, 2000);' –

Các vấn đề liên quan