我有一个运行长转换php脚本和进度轮询脚本的脚本。在看了几个关于这个主题的帖子后,我发现应该可以使用async ajax调用结合javascript的超时来创建一个定期轮询进度并用百分位数更新我的页面的构造。见下面的代码
function startExcelConversion(excelname){
var poll = function(){
setTimeout(function(){
$.ajax({
url: "../include/ajax/ajax.php?action=poll_progress",
success: function(data){
//Update the progress bar
// show progress
console.log('progresser: '+data);
$("#progress").val(data);
//Setup the next poll recursively
poll();
},
complete: function( jqXHR, textStatus ){
//Update the progress bar
// show progress
console.log(textStatus);
},
dataType: "json"
});
}, 3000);
};
poll();
//show loading image
console.log('starting conversion');
$('#progress').val("Excel openen...");
$('#main').prepend('<img id="loading" src="../include/image/load.gif">');
$("#loading").show();
$.ajax({
url: '../import/import_main.php?clean&action=importexcel&excelname='+excelname,
success: function(data) {
console.log(data);
$("#main").html(data)
$('#loading').hide();
}
});
return false;
}
第一个块启动运行一段时间的脚本(Excel读取和转换)。该脚本每10行更新一次数据库表以设置进度。第二个块(从开始轮询开始,应该启动一个php脚本,读取这个进度数据库字段并回显它,这样我就可以用百分位更新我的输入字段。但是在第一个php脚本的运行时没有调用轮询脚本(import_main) .php)。我尝试了$ .post和$ .get调用(默认情况下,$ .ajax应该是异步的。)也尝试了setInterval,但由于时间问题而无法使用并且不推荐。我在这里遗漏了一些明显的东西或者它是我缺少的PHP设置?
提前thnx答案 0 :(得分:1)
我会尝试在脚本顶部定义poll,例如:
var poll = function(){
setTimeout(function(){
$.ajax({
url: "../include/ajax/ajax.php?action=poll_progress",
success: function(data){
//Update the progress bar
// show progress
console.log('progresser: '+data);
$("#progress").val(data);
//Setup the next poll recursively
poll();
},
dataType: "json"
});
}, 3000);
});
然后在ajax调用之后调用它,比如poll()
。看看是否有帮助。现在,在ajax调用之后你有一个匿名函数,但它试图用poll()调用自己;在成功回调中,这不会被定义。
答案 1 :(得分:0)
第一个问题确实是使用了未在运行时定义的IIFE函数。所以使用内联函数如z416175描述肯定是有效的
第二个问题是,当一个会话在PHP中处于活动状态时,它将阻止其他(ajax)调用以防止会话覆盖。因此,在输入长时间运行的脚本之前使用session_write_close()可以允许异步ajax调用进行更新。看这篇文章(thnx到z416175)One ajax call block other ajax call
第三个问题是当你使用xdebug时,第二个问题仍然存在,因为xdebug保持会话打开,阻止异步ajax进度更新调用。因此,在测试xdebug导致此问题时,请注意
感谢所有输入。我已将z416175的帖子归功于他的回答和评论中的各种有用信息