iT邦幫忙

0

為什麼ajax跑迴圈,跑不到指定的圈數就會停下來呢?

小弟用javascript設定迴圈10萬,每跑一圈執行一次ajax,然後迴傳圈數到網頁上,但每次都跑不到1萬筆就會停下來,是為什麼呢?以下附上程式碼

js
$("#submit_btn").click(function(){
	
	var frequency = 50000;
	for(i = 0; i<frequency; i++){
		$.ajax({
			url:'ajax.php?action=encryption',
			type:'GET',
			dataType:'JSON',
			success:function(data){
				$("#aid").prepend(data.count+"<br>");
			},function(error){
				$("#aid").append("error<br>");
			}
		
		})
	}
})






html
<input type="button" id="submit_btn" value="開始運算加密"/> 
<br/>
<a id="aid"></a>






php
if(isset($_GET['action']) && $_GET['action'] == "encryption"){

	$query = "insert register_test (count) values ('1')";
	mysqli_query($con,$query) or die ("error");
	
	$query_count = "select * from register_test";
	$result_count = mysqli_query($con,$query_count) or die("error2");
	$count = mysqli_num_rows($result_count);
	$json = array(
				'count' => $count,
			);
	echo json_encode($json);
}
外獅佬 iT邦大師 1 級 ‧ 2015-05-15 10:28:59 檢舉
送出那麼多非同步的request,再強的電腦也會死掉....
賽門 iT邦超人 1 級 ‧ 2015-05-15 10:32:02 檢舉
因為太累~~偷笑
外獅佬 iT邦大師 1 級 ‧ 2015-05-15 10:36:41 檢舉
改成這樣:
$("#submit_btn").click(function(){  
      
    var frequency = 50000;  
    for(i = 0; i<frequency; i++){  
        $.ajax({  
            url:'ajax.php?action=encryption', 
            async: false,
            type:'GET',  
            dataType:'JSON',  
            success:function(data){  
                $("#aid").prepend(data.count+"<br>");  
            },function(error){  
                $("#aid").append("error<br>");  
            }  
          
        })  
    }  
})  

10萬次應該不會是問題失神

1 個回答

4
fillano
iT邦超人 1 級 ‧ 2015-05-16 19:52:32
最佳解答

你在做壓力測試喔XD

雖然外獅佬大大回應了,不過我還是補充一下。

  1. type: 'GET':這樣request可能會被瀏覽器cache,沒有實際傳到伺服器。所以雖然很忙,忙的是瀏覽器,失敗的原因有可能是瀏覽器撐不住這樣長時間跑Javascript,而request沒有時寄送到伺服器,等於白忙一場
  2. async: false:你的程式跑在瀏覽器的main thread,一些最新的瀏覽器會逐漸不支援這個選項的值為false,因為會影響使用者的使用經驗。不過透過web worker跑就沒這個限制。
  3. 你現在並沒有依照送出資料的順序收資料的需求,所以還好。不然非同步的ajax方法是不保證瀏覽器收到資料的順序的。

除了設定async: false,稍微用函數加上遞迴就可以把非同步方法改成同步。簡單地說,就是把$.ajax放到一個函數裡面,然後在success的時候呼叫這個函數,另外加一個變數來記錄次數,當次數到達時,結束遞迴(也就是在success的時候不再呼叫這個函數)。

ghyzsing iT邦新手 5 級 ‧ 2015-05-18 09:33:22 檢舉

原來是瀏覽器稱不住呀…一開始還想說是不是電腦不夠力,而且async: false竟然要淡出了,那就不考慮使用這個方法了…真是可惜。

小弟原先是自己寫了一個加密系統,然後想測試連續加密十萬筆需要的時間,測試server是否能夠稱的住,但在php裡執行十萬次,想看目前進度都要下一次sql 指令看目前進度,實在很不方便,所以想說做到前端上即時看到最新結果,沒想到遇上這問題冏…

fillano iT邦超人 1 級 ‧ 2015-05-19 09:01:39 檢舉

這樣...不知道您的加密系統是用什麼程式寫的,假設您已經做成一個或一組函數或方法,那另外寫一個測試用的函數或方法來呼叫,然後計算時間,這樣會比較可靠。透過http來測試的變數太多。

我要發表回答

立即登入回答