2014-09-20 77 views
0

我有這樣的代碼到一個遊戲,像一個Linux控制檯,我正在執行命令ping。Dosen't顯示正確的數字

當我想讓代碼顯示icpm_seq 0/1/2/3時,它只顯示icpm_seq 4

代碼:

function ping(IP){ 
    for (var i = 0; i <= 3; i++) { 
     var start = new Date().getTime(); 
     $.post("data_script/ping.php?IP=" + IP, 
     function(data){ 
      var newTime = new Date().getTime() - start; 
      // 0: bad (isn't online) 
      // 1: good (is online) 
      // 2: bad hostname 
      if(data == 0) 
      { 
       outputToConsole("Request timeout for icmp_seq " + i) 
      } 
      else 
      { 
       if(data == 1) 
       { 
       outputToConsole("64 bytes from " + IP + ": icmp_seq=" + i + " ttl=64 time: " + newTime + "ms"); 
       } 
       else 
       { 
        outputToConsole("ping: Cannot resolve hostname " + IP + ": unknown host") 
       } 
      } 
     }); 
     } 
    }  

回答

1

歡迎您的回調函數被調用的平安返回的時間異步編程...,循環結束了,我是4

什麼情況是

for i=0, i is <=3 
calls ping 
for i++, i is now 1, is <=3 
calls ping 
for i++ , i is now 2, is <=3 
calls ping 
for i++ , i is now 3, is <=3 
calls ping 
for i++ , i is now 4, is > 3 
breaks 
callback from ping 0 
callback from ping 1 
callback from ping 2 
callback from ping 3 

克服這一點,把你的回調閉包內,這樣

(function(seq) { 
    $.post("ping.php?IP=" + IP,function(data){ 
    log("icmp_seq " +seq+" returns "+data); 
    } 
})(i); 
+0

請問你能解釋一下,如何在var循環中取值4如果循環中不允許,這裏循環從0到3,這怎麼可能發生 – 2014-09-20 18:08:45

+0

for循環檢查'i <= 3「,然後調用'i ++'。所以當'i = 3'時,它會調用ping,運行'i ++',現在'i = 4'。然後它會再次檢查'i <= 3',現在這個錯誤是循環停止的。 – Rhumborl 2014-09-20 18:15:26