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

时间:2014-11-07 13:23:49

标签: javascript php ajax progress polling

我有一个运行长转换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

2 个答案:

答案 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的帖子归功于他的回答和评论中的各种有用信息