【问题标题】:.ajax() call won't complete until previous .ajax() call is complete?.ajax() 调用在之前的 .ajax() 调用完成之前不会完成?
【发布时间】:2012-01-18 20:39:06
【问题描述】:

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

我的问题是doProgressBar() 中的第一个.ajax() 调用在对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'] 加一

【问题讨论】:

  • 服务器在任何给定时间允许多少个连接?
  • @nobody 根据我的 IT 人员的说法,服务器允许大量连接。这是一个运行 Lampp 的内部 Ubuntu 开发服务器 - 大部分是默认值。

标签: php javascript jquery ajax


【解决方案1】:

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

编辑:我不确定这是否可行,但您可以尝试一下。每次要更新会话时,请致电session_start(),更新会话,然后致电session_write_close()。我不确定你是否可以在一个脚本中多次这样做,但它似乎应该可以工作。

【讨论】:

  • 不错的一个。没想到这一点,但它比我的回答更合理。我会留下我的以防万一……但在这里竖起大拇指。
  • @Frankie - 有趣,我对 your 的答案也有同样的想法。不看php代码很难说是哪个。
  • 我正在使用会话。我在所有涉及的文件上使用session_start()dnc_scrubber.php 设置$_SESSION['lines'],由lines.php 读取。它还会在通过 CSV 行时更新 $_SESSION['lines_processed']progress.php 返回该会话变量。这可能是我问题的根源。对于跟踪进度的更好方法,您有什么建议吗?
  • @Obi-wanJacobi - 我用你可以尝试的东西更新了我的答案。
【解决方案2】:

不确定这是否是您的问题的确切原因,但这是需要解决的问题。

改变

setTimeout(doProgressBar(), 100);

setTimeout(doProgressBar, 100);

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

【讨论】:

  • 谢谢,我会改的
【解决方案3】:

Ajax 将是异步的。

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

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

【讨论】:

  • lines.php 只是将会话变量作为 JSON 返回
  • @Obi-wan Jacobi 然后检查 gilly3 的答案。我会离开我的,以防万一有人在谷歌旁边遇到不同的问题,但我认为他解决了。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2011-02-18
    • 2014-07-03
    相关资源
    最近更新 更多