它看起来像这里的问题是,你希望返回的值被附加到rend字符串中的时间为下一个AJAX调用。这不会发生,因为调用是一个同步过程,但获取返回值是异步的。相反的:
AJAX Post 1 (rend='')
rend += 'id1,'
AJAX Post 2 (rend='id1,')
rend += 'id2,'
AJAX Post 3 (rend='id1,id2,')
// etc
的序列将最喜欢去的东西,如:
AJAX Post 1 (rend='')
AJAX Post 2 (rend='')
AJAX Post 3 (rend='')
// etc
// ... data is returned, not necessarily in order
rend += 'id2,'
rend += 'id1,'
rend += 'id3,'
// etc
为了让每个随后的AJAX调用知道什么是从服务器被以前返回,你不得不链这些呼叫,以便在前一个呼叫完成之前不会进行下一个AJAX呼叫。你可以用递归做到这一点,是这样的:
function fill_div(id, count) {
var rend = "";
var filler = $('#'+id);
// inner function for recursion
function doAjaxCall(i) {
$.ajax({'type':'POST',
'url':'/ads/render/',
'dataType':'json',
'data':{'rendered': rend})
.success(function(data){
filler.append('
rend+=data.mid.toString()+",";
_fill_ad(data);
// now send the next call
if (i < count) {
doAjaxCall(i+1);
}
});
}
// kick off the series
doAjaxCall(0);
}