我正在为一些大型查询创建一个脚本,并避免在php方面超时,另外给用户一些输入,我试图在jquery上创建大部分内容。
所以它的工作方式如下:首先,用户在选择中选择一条记录。当他点击按钮时,我得到了一个ajax调用,以json格式从该记录中获取我需要的详细信息。
通过响应,我得到了一个循环,它为第一次调用的每个结果调用ajax。
如果我将async设置为false可以正常工作,但浏览器会冻结,因为有几个ajax调用。那么有没有办法在异步关闭的情况下更新ui?
我的意思是,当我在循环中进行ajax调用时,我需要将异步设置为off对我来说没有任何意义。它可以同时进行几次调用,我很好,但为什么它不能获得该循环中的当前索引,除非我将异步设置为false?它继续使用第一个索引。
$("#button_copy").live('click', function(){
$('#button_copy').attr("disabled", true);
id = $('#select').val();
$.ajax({
type: "POST",
url: "query1.php",
dataType: 'json',
async:false,
cache: false,
data: 'id=' + id,
success: function( data ) {
var total1 = data['records'].length;
$("#console").append('Total query 1: ' + total1 + '<br />');
for (var i in data['records']) {
$.ajax({
type: "POST",
url: "query2.php",
dataType: 'json',
async:false,
cache: false,
data: 'id=' + data['records'][i].id,
success: function( data2 ) {
var total2 = data2['records2'].length;
$("#console").append('Total of query 2 from ' + data['records'][i].person + ': ' + total2 + '<br />');
},
error: function(data2) {
console.log(data2);
}
});
var percentprogress1 = (i / total1) * 10000;
$('#progressbar1').css('width',percentprogress1 + '%');
}
},
error: function(data) {
console.log(data);
}
});
});
答案 0 :(得分:2)
你会遇到问题,因为你试图在回调中使用i
,但是当调用回调时i
不再有原始值。您也不应该在数组上使用for ... in
- 仅在对象上使用。
我建议使用以下内容,而不是使用任何类型的for
循环,其中每个连续的AJAX调用在前一个完成后触发:
$.ajax(...).done(function(data) {
var all = data.records;
(function next() {
var record = all.shift();
if (record) {
$.post(...).done(next, function(res) {
// process inner result
// update UI, etc
...
});
}
})(); // invoke immediately
});
请注意,我使用了“延迟”语法,而不是在两个AJAX调用中传递success:
个处理程序。
在“伪递归”循环中注意我使用了.done(next, ...)
,它允许循环开始下一个AJAX并行调用 并处理当前调用的结果
答案 1 :(得分:1)
我自己也遇到过类似的问题。我在while循环中运行了一系列ajax请求。有些电话没有发出!它杀了我!!我的结论是我的浏览器 - 谷歌浏览器 - 忽略了#34;重复&#34;要求。
看看这个伪代码:
while (i < ajaxCallArray.length) {
currentAjaxObject = ajaxCallArray[i];
ajaxPost = $.post(currentAjaxObject.url, function(data) {
//response data needs to go into a function such that each request gets its own "data" variable created.otherwise it just overwrites data!!
processAjaxResponse(data, currentAjaxObject);
},"json");
i++;
}
如果ajaxCallArray[0].url = "http://www.google.com"
,ajaxCallArray[1].url = "http://www.google.com"
和ajaxCallArray[2].url = "http://www.google.com"
,浏览器只会实际拨打1个电话!!
解决方案:
您必须执行类似ajaxCallArray[0].url = "http://www.google.com?count=0"
,ajaxCallArray[1].url = "http://www.google.com?count=0"
和ajaxCallArray[2].url = "http://www.google.com?count=0"
的操作,即使您不使用这些网址参数,只需添加一些内容即可使它们与众不同。这样浏览器就会处理所有的呼叫,即使它们是立即完成的。
希望这会有所帮助!!