Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php jQuery没有';直到.load()的回调中的.ajax()完成为止?_Php_Jquery_Ajax - Fatal编程技术网

Php jQuery没有';直到.load()的回调中的.ajax()完成为止?

Php jQuery没有';直到.load()的回调中的.ajax()完成为止?,php,jquery,ajax,Php,Jquery,Ajax,我的问题是带有jQuery进度条(dnc_scriber.html)的在所有其他请求完成之前不会加载 这有什么关系吗?我想将#tabs-1的内容更改为进度条,并在dnc#u scriber.php工作时设置动画 lines.php和progress.php文件用于计算dnc_scriber.php完成的工作百分比,该百分比会随着会话的进行而更新lines.php和files.php返回会话变量 $('#tabs-1').load('dnc_scrubber.html', function() {

我的问题是带有jQuery进度条(
dnc_scriber.html
)的
在所有其他请求完成之前不会加载

这有什么关系吗?我想将
#tabs-1
的内容更改为进度条,并在
dnc#u scriber.php
工作时设置动画

lines.php
progress.php
文件用于计算
dnc_scriber.php
完成的工作百分比,该百分比会随着会话的进行而更新
lines.php
files.php
返回会话变量

$('#tabs-1').load('dnc_scrubber.html', function() {
    var querystring = 'col=' + col + '&' + makeQS(files);
    var lines = 0;

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

    $.ajax({
        url: 'dnc_scrubber.php',
        type: 'POST',
        async: true,
        data: querystring,
        complete: 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 />');
            }
        }
    });

    $.ajax({
        url: 'lines.php',
        async: true,
        dataType: 'json',
        complete: function(json) {
            lines = json.total;
        }
    });


    function setProgress() {
        if (prog < lines) {
            prog = getProgress();
            $('#progressbar').progressbar('option', 'value', prog);
            setTimeout(setProgress(), 1000)
        } else {
            $('#progressbar').progressbar('option', 'value', 100);
        }
    }

    var prog = getProgress();
    setTimeout(setProgress(), 1000);
});
$('tabs-1').load('dnc#u scriber.html',function(){
变量querystring='col='+col+'&'+makeQS(文件);
var线=0;
$('#progressbar').progressbar();
$.ajax({
url:'dnc_scruber.php',
键入:“POST”,
async:true,
数据:查询字符串,
完成:函数(){
对于(i=0;i');
$('#complete')。追加('
'); } } }); $.ajax({ url:'lines.php', async:true, 数据类型:“json”, 完成:函数(json){ lines=json.total; } }); 函数setProgress(){ 如果(程序<行){ prog=getProgress(); $('progressbar')。progressbar('option','value',prog); setTimeout(setProgress(),1000) }否则{ $('progressbar')。progressbar('option','value',100); } } var prog=getProgress(); setTimeout(setProgress(),1000); });
我已经尝试在
.ajax()
请求的回调函数中加载进度条,并将
async
设置为
false
。同样的结果也会发生-在完成dnc#u scriber.php之前,进度条不会加载到
#tabs-1


我能做什么?

好的,我盯着这个看了一会儿,它似乎有很多问题。把它作为一个答案,因为它太大,评论

  • 您的setTimeout应该包装在一个函数中;如前所述,这是一个语法错误:

    setTimeout(函数(){setProgress();},1000)

  • 您没有getProgress()函数,但是,至少对我来说,progress.php调用应该在该函数中,事实上,这没有任何意义。我在这里的假设是,对lines.php的ajax调用返回行数(文件),而progress是到目前为止处理的数,这应该会更新进度条吗?您还应该计算处理的行数与文件数的百分比为100。因此,例如,如果您有40个文件,到目前为止您已经处理了10个,那么它将显示25作为进度(40除以10等于25)。这允许您将setProgress()函数简化为“prog”,然后在最后自动变为100:

    函数setProgress(){ var prog=getProgress();//progress.php是否调用ajax $('progressbar')。progressbar('option','value',prog); 如果(程序<100){ setTimeout(函数(){setProgress();},1000); } }

  • 2A每秒移动一个ajax调用以处理:

    function getProgress() {
        var lines = 0;
        $.ajax({
            url: 'progress.php',
            async: false,
            data: '{}',
            dataType: 'json',
            success: function(json) {
                lines = json.total;
            }
        });
        return lines;// should be 0 to 100 to show progress percent
    };
    
  • 使用
    complete:
    而不是
    success:
    -即使出现错误,也可以完成流程,但success不会,并且不会在完整函数中捕获错误

  • 您对洗涤器的调用没有数据类型,因此它假定为json,您真的想将querystring附加到url字符串中,并将您的数据变为空:
    data:'{}',
    ?这对我来说是一个疯狂的假设,因为你没有列出你的
    makeQS()
    函数

  • 对lines.php的调用没有数据,在某些情况下可能会导致问题。在那里放一个空的
    数据:{},

  • 您的文件数组处理不是最有效的:

    success: function() {
        var fileLength = files.length;//assumes files does not change, keeps loop from a lookup on every loop.
        for (var i = 0; i < fileLength; i++) {
            var myMatch = 'MATCHED - ' + files[i];//better string handling - do one time only
            var myScrub = 'SCRUBBED - ' + files[i];
            $('#complete').append('<a href="process/' + myMatch + '">' + myMatch + '</a><br />');
            $('#complete').append('<a href="process/' + myScrub + '">' + myScrub + '</a><br />');
        }
    }
    
    success:function(){
    var fileLength=files.length;//假定文件不更改,则在每个循环上保留一个查找循环。
    对于(var i=0;i');
    $('#complete')。追加('
    '); } }
  • 您有许多全局变量,这通常不是一个很好的实践。例如“col”、“files”、“line”

  • setProgress中的“setTimeout”没有用分号正确终止


  • 您知道什么是同步和异步请求吗?您是否尝试过使用success:而不是complete?“我认为这会让每个人都像他们一样处理,而不是等待所有人。”Markschultheis只是尝试了一下,没有change@MarkSchultheiss
    success
    发生在
    complete
    之前,它们的行为应该是相同的。有关详细信息,请参阅我的答案,但底线是
    setTimeout(setProgress(),1000)
    的语法不正确。谢谢@MarkSchultheiss。诚然,我是一个JavaScript/jQueryNoob,并且已经更正了您指出的所有示例。通常,我主要从事服务器端和数据库处理。然而,今天早上我在查看代码后解决的原始问题。。。似乎
    getProgress()
    有一个
    $.ajax()
    调用
    async:false
    。它解决了这个问题。如果您感兴趣,在这个SO线程中讨论了关于这个项目的更多内容:我想知道这是否是真的,这会停止处理(正如我上面介绍的代码所示)。