虽然我在JavaScript中告诉它时循环不会结束

var hasData = '1'; while (hasData != 0) { $.ajax({ url: '/ajax.php?updateRow='+hasData, dataType: 'json', async: false, success: function(data) { hasData = data.next; $('.result').append(data.html); } }); 

应该怎么做:从PHP([html]和[next])拉出JSON数组。 如果[next]设置为0(当没有更多条目时) – while循环停止,应该是它。

发生了什么:除了 – 满足while()要求时所做的一切(所以当hasData设置为0时) – 循环进入无限循环(并且它会一直请求最后一个条目,直到脚本为止变得“反应迟钝”)

ajax发送请求并在有响应时执行回调。 所以发生的事情是:

  • 发出请求
  • 解雇另一个请求
  • 解雇另一个请求
  • 解雇另一个请求

因为它在一个while循环中。 您正在使用请求堵塞脚本,并且服务器会获得一堆可能无法处理的请求。

编辑:对不起,我错过了async: false 。 然而,这总是使浏览器反应迟钝。 最好的办法是使用async: true并在条件说明的情况下触发另一个,但只有在得到响应之后:

 function check() { $.ajax({ url: '/ajax.php?updateRow='+hasData, dataType: 'json', async: true, success: function(data) { hasData = data.next; $('.result').append(data.html); if(hasData != 0) check(); // do it again } }); } check(); // fire the first request 

正如Spycho指出的那样,既然你正在获取JSON,那么更方便的方法可能是:

 (function() { var fireRequest = function() { // this function is not available anywhere else, // to avoid having this process running more than once $.getJSON('/ajax.php', {updateRow: hasData}, function(data) { hasData = data.next; $('.result').append(data.html); if(hasData != 0) fireRequest(); // do it again }); }; fireRequest(); // start the process })(); // call it 

实际上,您的代码所做的与您自己的服务器上的拒绝服务攻击并不远:)

正如其他人已经指出的那样,Ajax请求在完成之前不会阻塞。 调用$.ajax立即返回,实际请求在后台执行,并在完成后调用success回调。 这一切都意味着Javascript尽可能快地循环,因为没有什么能阻止它。 这也意味着当您的第一个请求尝试完成时,Javascript可能会产生数千个新请求,这些请求都需要由服务器处理。

您的服务器会在同时处理这么多请求并且速度变慢时会感到不舒服(如果您检查它的CPU和内存使用情况,您会注意到)。 由于服务器速度减慢,Javascript会产生越来越多的请求……直到最后整个系统都停止运行,因为Javascript资源和服务器也可能耗尽。

在您的情况下,不建议使用while循环。 最好一次发送一个请求并检查success回调中的返回值。 如果它还不是0,则生成另一个请求,并重复该过程。

 function updateRows(onCompleted) { $.ajax({ url: '/ajax.php?updateRow='+hasData, dataType: 'json', success: function(data) { hasData = data.next; if (hasData == 0) { return onCompleted(); } $('.result').append(data.html); updateRows(onCompleted); // not finished yet, recursion } }); } 

onCompleted参数将是一个回调函数,一旦更新过程完成就会执行。 您可以按如下方式使用它:

 updateRows(function() { // Now all rows are updated // Proceed with program flow }); 

AJAX中的第一个A字母表示“异步”。 在最初的$.ajax()调用之后,浏览器不会等待响应,但是多次调用此函数。

 var hasData = 1; function ajaxRequest() { $.ajax({ //... success: function(data) { hasData = data.next; $('.result').append(data.html); if (hasData != 0) { ajaxRequest(); } } }); } 

另外我建议你将你的回复数据转换成数字

hasData = data.next * 1;

有时即使JSON返回一个数字,它也不被javascript和比较视为数字

hasData!= 0

即使hasData =“0”也会实现…

因为您已将async设置为false,所以浏览器将挂起,直到响应可用。 您的脚本可能不会陷入无限循环,它只是等待响应。

检查您的服务器端脚本是否真正有效。