2016-04-19 137 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

以上答案看起来不错,但没有回复任何回复。 –