之前的.ajax()调用完成后,.ajax()调用才会完成?

时间:2012-01-18 20:39:07

标签: php javascript jquery ajax

所以,我正在处理CSV处理脚本的进度条。 dnc_scrubber.php通过CSV并检查数据库中的电话号码,并在单独的文件中返回匹配和不匹配的数据。 lines.php返回要处理的行总数,而progress.php返回已处理的行数。我使用这两个数字来创建jQuery的progressbar函数的一部分工作。

我的问题是.ajax()内的第一个doProgressBar()电话在完成对dnc_scrubber.php的调用之后才会完成。为了澄清,在查看Chrome中的网络监视器时,请求与lines.php的请求同时发送dnc_scrubber.php,但在dnc_scrubber.php完成运行之前未收到任何响应。以下是相关代码:

$('#progressbar').progressbar();            


$.ajax({
url: 'dnc_scrubber.php',
type: 'POST',
async: true,
data: querystring,  
success: function(){
    for (i = 0; i < files.length; i++){
        $('#complete').append('<a href="process/MATCHED - ' + files[i] + '">MATCHED - ' + files[i] + '</a><br />');
        $('#complete').append('<a href="process/SCRUBBED - ' + files[i] + '">SCRUBBED - ' + files[i] + '</a><br />');
    }
}                       
});


function doProgressBar(){                   
$.ajax({
    url: 'lines.php',
    async: true,
    dataType: 'json',
    complete: function (rez) {
        lines = JSON.parse(rez.responseText);
        lines = parseInt(lines.lines);

        console.log('dpg1 - lines: ' + lines);

        $.ajax({
            url: 'progress.php',
            async: true,
            dataType: 'json',
            complete: function (rez1) {
                prog = JSON.parse(rez1.responseText);
                prog = parseInt(prog.progress);

                console.log('dpg2 - lines: ' + lines + ' prog: ' + prog);

                if (lines > prog){
                    var bar = (prog / lines) * 100;                                         
                    var bar = Math.round(bar);                                          
                    $('#progressbar').progressbar('option', 'value', bar);
                    setTimeout(doProgressBar(), 1000);
                    console.log('dpg3 - lines: ' + lines + ' prog: ' + prog + ' bar: ' + bar);
                } else if (lines == prog){
                    $('#progressbar').progressbar('option', 'value', 100);
                    console.log('dpg3 - lines == prog');
                }

            }
        });

    }
});
}



setTimeout(doProgressBar(), 100);

这是正常的功能吗?我想做的不可能吗?我很茫然......先谢谢你的帮助

编辑: lines.php

session_start();
header('Content-type: application/json');
echo json_encode(array('lines' => $_SESSION['lines']));

progress.php

session_start();
header('Content-type: application/json');
echo json_encode(array('progress' => $_SESSION['lines_processed']));

CSV处理器在每行的检查过程结束时将$_SESSION['lines_proccessed']递增1

4 个答案:

答案 0 :(得分:2)

不确定这是否是问题的确切原因,但需要修复。

更改

setTimeout(doProgressBar(), 100);

setTimeout(doProgressBar, 100);

您正在立即调用doProgressBar,而不是在超时完成后调用。

答案 1 :(得分:2)

最有可能的是,您的服务器将每个用户的并发连接数限制为1.或者,您正在使用会话,并且第一个脚本已将其锁定。第二个脚本将被阻止,直到第一个脚本释放其对会话文件的锁定。如果需要,只能使用session_start(),并在完成后立即使用session_write_close()释放锁定。

修改:我不确定这是否有用,但您可以尝试一下。每次要更新会话时,请致电session_start(),更新会话,然后致电session_write_close()。我不确定你是否被允许在脚本中多次这样做,但它似乎应该有效。

答案 2 :(得分:1)

Ajax将是assync。

lines.php可能正在等待dnc_scrubber.php,因为第一个已锁定MySQL。

这只是猜测,因为我们没有您的PHP代码,但尝试手动运行这两个PHP脚本并检查lines.php是否等待MySQL完成。

答案 3 :(得分:0)

使用PHP代码读取.csv文件时是否锁定文件?所以如果它必须读两次,它只会在前一个代码关闭流时读取它?

如果您打开2个浏览器并同时运行代码会发生什么?两个浏览器是否同时执行并获得相同的结果?还是等待文件?