2012-02-01 16 views
7

मैं निम्न लूप के प्रत्येक पुनरावृत्ति पर 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> 
+0

आप एक ही पते को 20 बार क्यों जियोकोड कर रहे हैं? एक उदाहरण के रूप में – ceejayoz

+0

। मैंने नोट किया कि कुछ एपीआई के आपूर्तिकर्ताओं (जैसे Google) आपको अपने दरवाजों पर बहुत बार बल्लेबाजी करने के लिए पसंद नहीं करते हैं। मैं टाइमर का उपयोग कर कॉल की आवृत्ति को कम करना चाहता हूं, लेकिन इसे लूप में उपयोग करने में परेशानी हो रही है, –

+0

यह सच है, लेकिन आप हर बार एक ही अनुरोध के साथ अपने दरवाजे पर क्यों बैंग करेंगे? – ceejayoz

उत्तर

11

आप इसे 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 बार में ठीक उसी पते पर एक geocode देखने कर रहे हैं?

+0

श्रीमान मित्र - कृपया ऊपर देखें –

4

शायद आप इसके लिए टाइमर का उपयोग करना चाहते हैं। यदि आप कोड में देरी लूप डाल देंगे, तो नतीजा यह होगा कि कोड को चलाने में अधिक समय लगेगा, लेकिन अंतिम परिणाम कोड समाप्त होने के बाद एक ही बार में दिखाई देगा।

आप सेटटाइमआउट या सेट इंटरवल विधियों का उपयोग कर सकते हैं। उदाहरण:

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

मैं पाश से छुटकारा और 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

मुझे लगता है आप नहीं बल्कि अगले पाश यात्रा शुरू करने के लिए नहीं चाहते हैं जब तक geocode देखने सही मायने में पूरा हो गया है है। तो, कीवर्ड "कॉलबैक" है:

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

सेटटाइमआउट/सेटइंटरवाल का उपयोग करके रोकना आपके लिए काम कर सकता है, लेकिन यह एक भ्रम है। अगर मैं आपके कोड को सही तरीके से पढ़ सकता हूं, तो मूल समस्या यह है कि आपका लूप geocoder.geocode से हर बार वापस लौटाता है। इसलिए, समानांतर geocode कॉल नहीं होने का एकमात्र तरीका तब तक इंतजार करना होगा जब तक कि कोई भी शुरू नहीं होने से पहले किया जाता है। उस ने कहा, लूप को और धीमा करने की कोई आवश्यकता नहीं है - अगर आप सभी को बचने की कोशिश कर रहे थे तो समानांतर कॉल थे। यदि आप अभी भी कॉल के बीच रोकना चाहते हैं, तो आपको अभी भी सेटटाइमआउट के साथ संयोजन में कॉलबैक का उपयोग करना चाहिए। –

+0

हां, मैं समांतर कॉल से बचने के साथ-साथ लूप को धीमा करना चाहता हूं। ऐसा लगता है कि Google एपीआई को सिंक्रनाइज़ेशन करने के लिए कोई रास्ता नहीं है, इसलिए मुझे सब कुछ अपनी सिक्योरिटी फक्शन में ढेर करना है। मैं आपके कोड को समझने की कोशिश करूंगा ... –

+0

उपर्युक्त समानांतर कॉल को समाप्त करता है; कॉल के बीच रुकने के लिए, ऐसा करें: 'अगर (काउंटर <20) { window.setTimeout (फ़ंक्शन() { कुत्ते (geoCallback); } }, 2000); ' –

संबंधित मुद्दे