我有一些ajax脚本,可以发出大约250个同步PHP调用。这是我的脚本
$(document).ready(function(){
$("#generate").html("<div class='modal'><p>Initializing...</p></div>");
$.ajax({
url:'/fetch around 250 url from database.php',
async:false,
dataType: 'json',
success: function(data){
$.each(data,function(key,val){
$("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
saveimage(val.url);
}
$("#generate").html("<div class='modal'><p>done</p></div>");
finalcreate();
},
});
});
function saveimage(){
$.ajax({
url: 'do some php work.php',
async: false,
});
}
function finalcreate(){
$.ajax({
url: 'do some php work.php',
async: false,
});
}在第一部分中,脚本从数据库中获取超过250个url,并使用另一个ajax调用为每个url脚本执行一些php计算。当循环结束时,脚本执行最后的ajax调用。
当我在firefox中运行这个程序时,它只成功运行了40个urls,然后浏览器显示了一个对话框,其中包含用户是否要停止此脚本的选项,如果用户想要运行此脚本,则该脚本将为接下来的40个urls再次运行,直到最后都是相同的过程。如何优化此脚本,我不希望浏览器显示选项停止此脚本。请帮帮忙。
谢谢
发布于 2012-09-07 02:29:24
试试这个:
function nextrequest() {
if (requests.length == 0) {
$("#generate").html("<div class='modal'><p>done</p></div>");
finalcreate();
return;
}
var val = requests.pop();
$("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
saveimage(val.url);
}
var requests = [];
$(document).ready(function(){
$("#generate").html("<div class='modal'><p>Initializing...</p></div>");
$.ajax({
url:'/fetch around 250 url from database.php',
dataType: 'json',
success: function(data){
requests = data;
nextrequest();
},
});
});
function saveimage(){
$.ajax({
url: 'do some php work.php',
success: function(data) {
// do something...
nextrequest();
}
});
}
function finalcreate(){
$.ajax({
url: 'do some php work.php',
});
}您将所有的URL存储在一个全局变量中,每次请求完成时,您都会获得下一个URL,直到所有的URL都被使用,(requests.length == 0),您将调用最后一个请求。
这样,用户仍然可以在页面上执行其他操作,而您可以在每次请求完成时显示进度。此外,一件好事是你可以一次调用2个或更多,以使过程更快。
发布于 2012-09-07 02:19:06
Ajax调用需要很长时间才能完成,因为它与远程服务器通信。最慢的事情是对服务器的查询。您应该向服务器发送一个包含所有需要的数据的批处理请求,服务器应该分离数据并处理它。所有的事情都应该快250倍左右完成。
发布于 2012-09-07 02:29:59
为每个ajax请求设置一定的时间间隔
success: function(data){
$.each(data,function(key,val){
$("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
setTimeout(saveimage(val.url),3000);
}https://stackoverflow.com/questions/12306005
复制相似问题