0

我想设置一个进度条,显示导入大型 CSV 文件并传递到数据库的长时间工作任务的进度。我通过初始 jQuery.ajax 调用开始导入过程,并设置超时以从这些文件中获取已处理的行的百分比。

问题是当我启动初始 ajax 调用时,所有其他 ajax 调用只是等待执行,直到初始调用完成。

所以这是我的代码:

var progress = false;
var update_progress = function() {
    if(progress) {
        $.ajax({
            url: 'index.php?do=update_progress'
        },
        function(json) {
            // Something < 100
            if(json.perc !== undefined) {
                $('#progress').css('width', json.perc + '%');
            }
            setTimeout(update_progress, 1000);
        });
    }
}
var start_import = function(i) {

    // Setting progress allowed
    progress = true;

    // start the update in 1s
    setTimeout(update_progress, 1000);

    // start the database-import (20-30 seconds runtime on server)
    $.ajax({
        url: 'index.php?do=start_import'
    },
    function(json) {

        // Import finished, disallow progressing
        progress = false;


        // Finally always complete: json.perc is 100
        if(json.perc !== undefined) {
            $('#progress').css('width', json.perc + '%');
        }
    });
};
start_import();

这有点令人困惑,因为我认为每个调用都可以异步工作。怎么了?

问候蒂姆

4

1 回答 1

1

你为什么不打电话setInterval()而不是打电话setTimeout()?这就是问题!函数的下一次调用update_progress()将在上一个 AJAX 调用的回调返回之后发生!

于 2018-07-04T14:07:51.690 回答