2016-04-19 372 views
0

我正在處理一個程序,該程序通過使用XHR請求通過post方法向processId.php發送用戶標識來檢查用戶標識是否存在。我首先在ID數組中的for循環中嘗試了XHR請求,但是它殺死了瀏覽器,因爲它由數千個元素組成,因爲一次創建了數千個XHR請求。然後我在StackOverflow上找到一篇文章,說我不應該在for循環中使用XHR請求,而應該在函數中調用函數,以便我編寫以下代碼。該程序似乎工作,但殺死瀏覽器,因爲仍然有成千上萬的請求。當前請求完成後一次XHR請求

我想弄清楚一個星期後,如何在完成當前/進程內XHR請求後一次完成一個XHR請求。任何幫助?我可以爲此創建一個完整功能的任何解決方案。

PS:我不想使用jQuery。

<?php 
$php_array_id = [element-1,element-2.........,element-n]; 
$js_array_id = json_encode($php_array); 
echo "var userIds = ". $js_array_id . ";\n"; 
$url = "http://example.com/idProcess.php"; 
?> 

<script> 

function processNext(i) { 
     if (i < userIds.length) { 
     var http = new XMLHttpRequest(); 
     var url = "<?php echo $url ?>"; 
     var params = "id=" + userIds[i]; 
     http.open("POST", url, true); 
     http.onreadystatechange = function() { 
      if(this.readyState == 4 && this.status == 200) { 
       if(this.responseText){ 
         document.getElementById("reports").innerHTML += "<div>ID = " + this.responseText + " Exists</div>"; 
       } 
      } 
     } 
     http.send(params); 
     i++; 
     processNext(i); 

     } 
    } 

processNext(0); 

</script> 

回答

0

試試這個

<script> 
var userIds = <?php echo($js_array_id) ?>; 

function processNext(i) { 
     var http = new XMLHttpRequest(); 
     var url = "<?php echo($url) ?>"; 
     var params = "id=" + userIds[i]; 
     http.open("POST", url, true); 
     http.onreadystatechange = function() { 
       if(this.readyState == 4 && this.status == 200) { 
        if(this.responseText){ 
          document.getElementById("reports").innerHTML += "<div>ID = " + this.responseText + " Exists</div>"; 
          i++; 
          if(i<userIds.length){processNext(i);} 
        } 
       } 
      } 
      http.send(params); 
    } 

processNext(0); 

+0

你能解釋一下主要的變化嗎?我認爲這個函數應該在statechange函數中調用?對? –

+0

是的,所以另一個請求會在前一個請求結束後立即發送。 – dormouse

+0

是的..現在它正在發送請求,當一個結束。謝謝。 –

0

歡迎asynchronous callback

說的奇妙世界,是怎麼來要通過一個XHR檢查成千上萬的用戶ID?

+0

我認爲這並不重要。 –

+0

以上答案看起來不錯,但沒有回覆任何回覆。 –