我是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。
答案 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)