2012-02-01 7 views
7

次のループの各繰り返しで1-2秒の遅延を追加したいと思います。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

なぜ同じアドレスを20回ジオコーディングしていますか? – ceejayoz

+0

を例にとって説明する。 GoogleのようなAPIのサプライヤの中には、あまりにも激しく彼らのドアを叩くのが好きではないことに気づいた。私はタイマーを使用してコールの頻度を減らしたいが、ループでそれを使用するのに問題がある、 –

+0

それは本当ですが、毎回同じ要求で彼らのドアを叩くのはなぜですか? – ceejayoz

答えて

11

$(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倍をジオコードのルックアップをやっている理由は、私は疑問に思う作るのですか?

+0

mr friend - 上記を参照してください。 –

4

おそらくタイマーを使用したいと思うでしょう。コードに遅延ループを入れるだけでは、コードの実行に時間がかかることになりますが、コードが終了した後で最終結果がすべて一度に表示されます。

setTimeoutまたはsetIntervalメソッドを使用できます。例:あなたがsetTimeout()と、このようにそれを行うことができます

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

私はジオコードのルックアップが本当に完了するまで、あなたではなく、次のループ反復を開始しないようにしたい気持ちを持っています。したがって、キーワード「コールバック」は、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

setTimeout/setIntervalを使用して一時停止するとすべて機能するかもしれませんが、それは幻想です。あなたのコードを正しく読むことができれば、元の問題はループがgeocoder.geocodeが毎回戻ってくるよりも速いということです。したがって、並列ジオコード・コールを持たない唯一の方法は、次のジオコード・コールを開始する前に完了するまで待つことです。つまり、ループをさらに遅くする必要はありません。回避しようとしているのはすべて並列呼び出しだった場合です。コール間で一時停止したい場合は、引き続きsetTimeoutと組み合わせてコールバックを使用する必要があります。 –

+0

はい、私は並列呼び出しを避け、ループの速度を落としたいと思います。私は彼らの成功のfuctionsにすべてをスタックする必要がありますので、同期するようにGoogleのAPIを作る方法はないようです。私はあなたのコードを理解しようとします... –

+0

上記は並列呼び出しを排除します。 (カウンタ<20) { ){ dogeo(ジオコールバック); } }、2000); ' –

関連する問題