Javascript 如何使用javasctipt和ajax制作轮询脚本

Javascript 如何使用javasctipt和ajax制作轮询脚本,javascript,php,ajax,progress,polling,Javascript,Php,Ajax,Progress,Polling,我有一个运行长转换php脚本和进度轮询脚本的脚本。在看了几篇关于这个主题的文章后,我发现应该可以使用异步ajax调用结合javascript超时来创建一个结构,定期轮询进度并用百分位数更新我的页面。请参阅下面的代码 function startExcelConversion(excelname){ var poll = function(){ setTimeout(function(){ $.ajax({ url: "../include/ajax/aja

我有一个运行长转换php脚本和进度轮询脚本的脚本。在看了几篇关于这个主题的文章后,我发现应该可以使用异步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;
函数startExcelConversion(excelname){
var poll=function(){
setTimeout(函数(){
$.ajax({
url:“../include/ajax/ajax.php?action=poll\u progress”,
成功:功能(数据){
//更新进度条
//显示进步
console.log('progresser:'+数据);
$(“#进度”).val(数据);
//以递归方式设置下一次轮询
poll();
}, 
完成:函数(jqXHR,textStatus){
//更新进度条
//显示进步
console.log(textStatus);
},
数据类型:“json”
});
}, 3000);
};    
poll();
//显示加载图像
log(“开始转换”);
$('#progress').val(“Excel openen…”);
$('#main')。前置('');
$(“#加载”).show();
$.ajax({
url:“../import/import_main.php?clean&action=importexcel&excelname=”+excelname,
成功:功能(数据){
控制台日志(数据);
$(“#main”).html(数据)
$(“#加载”).hide();
}     
});
返回false;
}

第一个块启动运行一段时间的脚本(excel读取和转换)。此脚本每10行更新一个数据库表以设置进度。第二个块(从开始轮询开始)应该启动一个php脚本,读取这个进度数据库字段并回显它,这样我就可以用百分位数更新我的输入字段。但是在第一个php脚本(import_main.php)的运行时没有调用轮询脚本。我尝试了$.post和$.get调用(默认情况下,$.ajax应该是异步的)。也尝试了setInterval,但由于时间问题,它不起作用,因此不推荐使用。我是缺少了一些明显的内容,还是缺少了php中的设置


thnx预先

我会尝试在脚本顶部定义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()调用自己;在成功回调中,这将不会被定义。

结果表明问题有三个方面:

第一个问题确实是使用了一个在运行时没有定义的IIFE函数,所以使用像z416175这样的内联函数肯定是有效的

第二个问题是,当一个会话在PHP中处于活动状态时,它会阻止其他(ajax)调用以防止会话覆盖。因此,在进入长时间运行的脚本之前使用session_write_close()可以允许异步ajax调用进行进度更新。请参阅本文(thnx到z416175)

第三个问题是,当您使用xdebug时,第二个问题仍然存在,因为xdebug保持会话打开,以防止异步ajax进度更新调用


感谢所有的输入。我相信z416175的帖子在他的回答和评论中提供了各种有用的信息

poll()不会在上面的代码中定义,但是在成功回调中,您尝试使用poll()调用它;无论如何,没有理由在这里使用这样的闭包,没有任何好处。啊,你是对的,succes作用域不包含该定义。Smart如果他将其用作普通函数而不是IIFE,那么他的代码也可以工作。他的问题是他使用的是IIFE。他在声明之后使用该函数并不重要。普通对象(功能)将是可用的,因为它是在编译时定义的。IIFE是在运行时定义的。检查我的。我没有意识到该函数将不会被定义。但是在调整脚本后,我的轮询函数仍然没有被调用/执行。我现在将轮询定义为代码中所述的函数变量。然后对e转换脚本,然后调用poll();没用。我也试着在第一次ajax调用之前调用它,但什么都没有。我甚至在轮询中添加了一个完整的回调函数,以防出现错误,但这也从未达到。我将更新我问题中的代码以反映嗯……否则代码似乎很好,至少在javascript方面是这样,而且它没有成功是非常奇怪的s或错误回调。如果您使用的是Chrome,则应查看调试器中的“网络”选项卡(确保记录已激活,左上角)我猜问题在于php方面,否则你应该得到一个成功或错误的回调。这可能是,但奇怪的是,我可以在main_import.php脚本中设置一个断点,它将命中并停止(使用带有xdebug的netbeans)但是ajax.php脚本不会停止。我测试了ajax.php脚本,没有错误(只有一个问题和百分位数的打印)。导入脚本使用了大量内存和时间(使用phpexcel读取excel文件),但关键是我可以异步更新进度