我有一些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,并且对于每个url脚本,使用另一个ajax调用进行一些php计算。当循环结束脚本时,做最后的ajax调用。
当我在firefox中运行此程序时,它仅成功运行40个url,然后浏览器显示对话框,其中包含用户是否要停止此脚本的选项,如果用户想要运行此脚本,则脚本再次运行接下来的40个网址,同样的过程发生到最后。 我如何优化此脚本,我不希望浏览器显示选项来停止此脚本。请帮忙。
由于
答案 0 :(得分:2)
试试这个:
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',
});
}
您将所有网址存储在一个全局变量中,每次请求完成后,您都会获得下一个网址,直到所有网址被消费,(requests.length == 0)
,您才会调用最终请求。
这样,用户仍然可以在页面上执行其他操作,并且您可以在每次请求完成时显示进度。此外,一件好事是,您可以一次或多次拨打2个电话,以加快处理速度。
答案 1 :(得分:0)
Ajax调用需要很长时间才能完成,因为它与远程服务器通信。最慢的是对服务器的查询。您应该发送一个批处理请求,其中包含服务器所需的所有数据,应该将数据分开并处理它。一切都应该完成大约250倍。
答案 2 :(得分:0)
为每个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);
}