Ajax - 如何等待php完成?

时间:2013-03-04 18:01:55

标签: javascript jquery ajax

我是Ajax的完全菜鸟所以请原谅我,如果这是一个完全愚蠢的代码:

for (var i=0; i<11; i++) {
    jQuery('#position').html(i);
    var offset = jQuery('#offset').html();
    var postcall = 'controller.php?url='+encodeURIComponent(scrapurl)+'&scrape_absolute='+absoluteep+'&scrape_season='+season+'&scrape_show='+showslug+'&scrape_defimg='+encodeURIComponent(defaultimg)+'&offset='+offset;
    jQuery.post(postcall,function(data){
    jQuery('#offset').html(data);
    });
  }

这里的目标是使用给定的值执行controller.php,并使用返回的信息将'offset'插回到每个调用中。它工作但它立即从0到10运行,我的网络服务器拒绝后续调用。

我的目标是确保在最后一次操作完成之前不会再次调用php。

2 个答案:

答案 0 :(得分:2)

关键是在回调函数的中进行下一次AJAX调用。这样,你的下一篇文章将不会发生,直到第一次完成。在您的代码中,因为.post()是非阻塞的(异步),它会立即继续循环,递增i / #position并触发下一个.post()

要解决此问题,请将.post()封装在包装函数中。有一个计数器跟踪它被调用的次数。从.post()的回调中调用该函数,最终得到一个递归函数,它将按顺序执行调用:

var position=0;

function doNextAJAXPost() {
    if(position < 11) {
        jQuery('#position').html(position);
        position++;
        var offset = jQuery('#offset').html();

        jQuery.post('controller.php?url='+encodeURIComponent(scrapurl)+'&scrape_absolute='+absoluteep+'&scrape_season='+season+'&scrape_show='+showslug+'&scrape_defimg='+encodeURIComponent(defaultimg)+'&offset='+offset, function(data){
            jQuery('#offset').html(data);
            doNextAJAXPost();
        });
    }
}

doNextAJAXPost();

答案 1 :(得分:0)

使用自执行递归函数

(function callself(i) {
  jQuery('#position').html(i);
  var offset = jQuery('#offset').html();
  var postcall = 'controller.php?url='+encodeURIComponent(scrapurl)+'&scrape_absolute='+absoluteep+'&scrape_season='+season+'&scrape_show='+showslug+'&scrape_defimg='+encodeURIComponent(defaultimg)+'&offset='+offset;
  jQuery.post(postcall,function(data){
    jQuery('#offset').html(data);
    i++;
    if ( i < 11 ) callself(i);
  });
})(0)