Похоже, проблема здесь в том, что вы ожидаете, что возвращаемые значения будут добавлены в строку 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('<div id="' + data.adid + '"></div>');
rend+=data.mid.toString()+",";
_fill_ad(data);
// now send the next call
if (i < count) {
doAjaxCall(i+1);
}
});
}
// kick off the series
doAjaxCall(0);
}