jQuery不会.load()直到.load()的回调中的.ajax()完成?

时间:2012-01-18 13:39:38

标签: php jquery ajax

我的问题是,在完成所有其他请求之前,不会加载带有jQuery进度条<div>的{​​{1}}。

这周围有吗?我想将dnc_scrubber.html的内容更改为进度条,并在#tabs-1正在执行其工作时为其设置动画。

dnc_scrubber.phplines.php文件用于计算progress.php完成工作的百分比 - 它会随着时间的推移更新会话。 dnc_scrubber.phplines.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); }); 请求的回调函数中加载进度条,.ajax()设置为async。发生相同的结果 - 在false完成之前,进度条未加载到#tabs-1

我该怎么办?

1 个答案:

答案 0 :(得分:2)

好吧,我盯着这看了一下,似乎有很多问题/问题。把它作为一个答案,因为它太大而无法评论。

  1. 你的setTimeout应该包含在一个函数中;如所写,这是一个语法错误:

    setTimeout(function() { setProgress(); }, 1000);

  2. 你没有getProgress()函数,但至少对我来说,似乎progress.php调用应该是IN函数,因为它是没有道理的。我的假设是,对lines.php的ajax调用返回行数(文件),进度是到目前为止处理的数字,那应该更新进度条?您还应该处理100行的处理百分比与文件数的百分比。因此,如果您有40个文件,并且到目前为止处理了10个,那么它将显示25个进度(40除以10为25)。这允许您将setProgress()函数简化为“prog”,然后在结束时自动达到100:

    function setProgress(){     var prog = getProgress(); //执行progress.php ajax调用     $('#progressbar')。progressbar('option','value',prog);     if(prog <100){         setTimeout(function(){setProgress();},1000);     } }

  3. 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
    };
    
    1. 使用complete:而非success: - 即使您收到错误也会完成整个过程,但成功不会,并且您不会在完整函数中捕获错误。

      < / LI>
    2. 您对scrubber的调用没有数据类型,因此它假定为json,您是否真的要将查询字符串附加到url字符串并将数据空为:data: '{}',?由于您没有列出makeQS()函数,这是一个疯狂的假设。

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

    4. 您的文件数组处理效率不高:

      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 />');
          }
      }
      
    5. 您有许多全局变量,这通常不是一个好习惯。例如“col”,“files”,“lines”。

    6. setProgress中的“setTimeout”未使用分号正确终止。