与jQuery和Ajax同时执行2个后台任务

时间:2013-02-28 17:01:31

标签: php jquery ajax process background-process

更新了我的问题

我制作了一个用户可以导入大量数据的脚本。提交表单并验证数据后,我添加了2个后台任务:1是导入所有数据的脚本。该脚本还允许数据库知道总数和已完成的数量。第二个是一个脚本,它读取从数据库中完成的工作量并将其显示在一个很好的进度条中。

代码:

$.ajax({
    type: "GET",
    url: "import-process.php",
    success: function(data) {}
});

var process = 0;
var checkPercentage = function() {
    $.ajax({
        type: "GET",
        url: "get-process-status.php",
        data: "importcode=123456",
        success: function(data) {
            if (!data.indexOf("ERROR") !== -1) {
                process = data;
                $("#process_balk").css('width', process + '%');
            }
        }
    });

    if (process != 100) {
        setTimeout(checkPercentage, 1000);
    } else {
        window.location.href = "import-finished.php";
    }
}

checkPercentage();

这两个脚本都运行正常。除了第一个脚本(获取进程的状态)在第一个(导入数据)完成后没有启动。这使得完整的事情变得毫无用处。

任何想法如何解决这个问题?

更新 我发现后台进程只被调用一次。那就是问题所在。我只是不确定如何解决它..

var checkPercentage = function() {
    alert("Is this function getting called every second?");
    $.ajax({
        type: "GET",
        async: true,
        url: "required/get-process-status.php",
        data: "importcode=123456",
        success: function(data) {
            alert(data);
        }
    });
    setTimeout(checkPercentage, 1000);
}

上面的代码警告“这个函数每秒都被调用一次吗?”每一秒。喜欢它应该。但是,值'data'只调用一次。这不是我的预期......有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你的意思是这样的?:

$.ajax({
    type: "GET",
    url: "import-process.php",
    success: function(data) {
        checkPercentage();
    }
});

var process = 0;
var checkPercentage = function() {
    $.ajax({
        type: "GET",
        url: "get-process-status.php",
        data: "importcode=123456",
        success: function(data) {
            if (!data.indexOf("ERROR") !== -1) {
                process = data;
                $("#process_balk").css('width', process + '%');
            }
        }
    });

    if (process != 100) {
        setTimeout(checkPercentage, 1000);
    } else {
        window.location.href = "import-finished.php";
    }
}

我刚刚将checkPercantage函数调用从脚本结束移动到第一个ajax的success函数。如果您希望尽管有错误,也可以将其移动到complete功能。

答案 1 :(得分:0)

将您的回调函数设置为:

success: function(data) {
        if (!data.indexOf("ERROR") !== -1) {
            process = data;
            $("#process_balk").css('width', process + '%');
            if (process != 100) {
               setInterval(checkPercentage, 1000);
            } else {
               window.location.href = "import-finished.php";
            }
        }
    }

首先,if语句必须在回调函数中才能按您希望的方式工作。其次,您应该使用setInterval()代替setTimeout(),因为它会在每个间隔时间重新检查一次。

另外,yabol说你的代码顶部应该是这样的:

$.ajax({
type: "GET",
url: "import-process.php",
success: function(data) {
    checkPercentage();
}
});