for循环中的Ajax请求(Ajax request in for loop)

我想用for循环循环100次ajax请求。 这是我的代码:

for(var i=1; i<100; i++)

{

var num = i+1;

var request = new XMLHttpRequest();

request.open("GET", "http://localhost/test/1/2/main.php?t="+num+"", true);

request.send(null);

request.onreadystatechange = function() {

if (request.readyState == 4) {

var parser = new DOMParser();

var doc = parser.parseFromString(request.responseText, "text/html");

var rows = doc.getElementsByTagName("table")[0].getElementsByTagName("tbody")[0].getElementsByTagName("tr");

var sum = 0;

for(var j=0; j

{

sum += parseInt( rows[j].getElementsByTagName("td")[7].textContent.trim() );

}

alert(num);

}

}

}

但它不起作用。 在控制台中,我看到100次此信息:

等等一切都应该没问题。 但我只看到警报14次(我现在不知道为什么14次),没有100次。

为什么这个程序不起作用?

I'd like to loop 100 times ajax request with for loop. This is my code :

for(var i=1; i<100; i++)

{

var num = i+1;

var request = new XMLHttpRequest();

request.open("GET", "http://localhost/test/1/2/main.php?t="+num+"", true);

request.send(null);

request.onreadystatechange = function() {

if (request.readyState == 4) {

var parser = new DOMParser();

var doc = parser.parseFromString(request.responseText, "text/html");

var rows = doc.getElementsByTagName("table")[0].getElementsByTagName("tbody")[0].getElementsByTagName("tr");

var sum = 0;

for(var j=0; j

{

sum += parseInt( rows[j].getElementsByTagName("td")[7].textContent.trim() );

}

alert(num);

}

}

}

But it's not working. In console I see 100 times this information:

Etc. So everything should be ok. But I see alert only 14 times (I don't now why 14),no 100.

Why this program not working?

原文:https://stackoverflow.com/questions/39269211

更新时间:2020-01-18 15:56

最满意答案

请在下面的代码。 这将允许仅在上一次完成之后触发ajax调用。 所以不会错过任何ajax电话。

var num = 0;

doAjax(0);

function doAjax(arrCount)

{

if(num<100){

num += 1;

var request = new XMLHttpRequest();

request.open("GET", "http://localhost/test/1/2/main.php?t="+num+"", true);

request.send(null);

request.onreadystatechange = function() {

if (request.readyState == 4) {

var parser = new DOMParser();

var doc = parser.parseFromString(request.responseText, "text/html");

var rows = doc.getElementsByTagName("table")[0].getElementsByTagName("tbody")[0].getElementsByTagName("tr");

var sum = 0;

for(var j=0; j

{

sum += parseInt( rows[j].getElementsByTagName("td")[7].textContent.trim() );

}

alert(num);

doAjax(num)

}

}

}

}

Please below code. Which will allow to fire ajax call only after previous has been completed. So no ajax call will missed.

var num = 0;

doAjax(0);

function doAjax(arrCount)

{

if(num<100){

num += 1;

var request = new XMLHttpRequest();

request.open("GET", "http://localhost/test/1/2/main.php?t="+num+"", true);

request.send(null);

request.onreadystatechange = function() {

if (request.readyState == 4) {

var parser = new DOMParser();

var doc = parser.parseFromString(request.responseText, "text/html");

var rows = doc.getElementsByTagName("table")[0].getElementsByTagName("tbody")[0].getElementsByTagName("tr");

var sum = 0;

for(var j=0; j

{

sum += parseInt( rows[j].getElementsByTagName("td")[7].textContent.trim() );

}

alert(num);

doAjax(num)

}

}

}

}

相关问答

多谢你们。 我找到了一个解决方案。 我把这个功能分成了两个功能。 当第一个请求完成时,它调用第二个启动在promise中声明的请求。 Thanks guys. I've have find a solution. I separated the function in two functions. When the first has done its request, it calls the second one which launches its requests declared in

...

使用.append() $("#cc-msg").append(html + 'ajax_loader.gif');

According to Anthony Grist comments, this AJAX request should not have async: false parameter. So, the answer is

...

在ajax请求中的完整函数中调用下一个请求 var values = ["url1", "url2", "url3"];

values.forEach(function(value, i) {

var jsonReq = JSON.stringify({

action: 101,

supported: value

});

...

$.ajax({

type: "POST",

url:

...

你的问题是,当执行回调时, i有循环结束的值。 修复的标准解决方案是添加一个中间立即调用的函数来保护i的值: for (var i = 0; i < 20; i++) {

(function(i){

... your code

})(i);

}

对函数的调用创建了一个范围,其中i是一个不同的变量。 Here's how I fixed it: function run(i, howManyToRun, start) {

if(i >= howManyToRun)

...

我认为你正在寻找这样的东西: $.ajax({

type: "POST",

url: "_js/changetags.php",

dataType:'json',

success: function(data){

var arr = data.tagsinserted.split(',');

for(var i = 0; i

//Bad idea to use .each(

...

您可以使用占位符。 $.each(elem, function (index, item) {

var $placeholder = $('

').appendTo("div.content");

$.ajax({

type: 'post' ,

url: moviesSearchUrl + '&q=' + encodeURI(item) + '&page_limit=1'

...

好,谢谢。 经过几个小时的分析和反思,我意识到为什么这个脚本会同步:我打开script.php文件,我注意到这个和文件的beginig: <?php

session_start();

$var1=$_SESSION['SOMEVAR'];

.......

//do php script.....

.......

?>

所以我有一个使用会话的php脚本并行ajax调用,但会话在这种情况下锁定了要执行syncrosnly会话变量请求的原因,所以这个问题的解决方案是: <?php

session_s

...

请在下面的代码。 这将允许仅在上一次完成之后触发ajax调用。 所以不会错过任何ajax电话。

var num = 0;

doAjax(0);

function doAjax(arrCount)

{

if(num<100){

num += 1;

var request = new XMLHttpRequest();

...

这是预期的行为,因为请求是异步的。 它们可能按您需要的顺序触发,但响应时间完全取决于服务器以及处理每个请求所需的时间。 例如,假设您提出3个请求。 #1需要150ms才能完成,#2 200ms和#3 75ms。 然后,您的done()处理程序将按顺序执行3,1,2。 如果您依赖于按特定顺序处理的响应,则需要修改代码以在单个请求中发送所有数据,以便可以根据需要格式化响应。 使用async: false可能会创建您期望的行为,但使用它是非常糟糕的做法,并且上述解决方案将更加可取。 This is ex

...

您正在循环中输出您的 ,这意味着您正在生成多个重复的ID。 DOM ID 必须在整个文档中是唯一的。 由于你有重复项, $('#editform')将只返回它找到的第一个匹配元素 - 它不会返回任何其他元素,因为它不应该。 更改为使用类而不是id来标记元素,或者使用您在点击内捕获的event并从中提取点击目标。 You're outputting your in a loop, which means you're produ

...

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐