我在循环中发出请求,尝试累积每次返回的对象的ID并发送到后续请求,以便它们不会再次返回。但是,累加器变量(显然)在.ajax()
成功回调之外,当我通过调用的数据对象传递时,它是空的。
function fill_div(id, count) {
var rend = "";
var filler = $('#'+id);
for(i = 0; i < count; 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);
});
}
}
当我在chrome的检查器中查看请求时,变量存在于post数据中,但是没有值。我觉得我得到的东西搞砸了范围。
答案 0 :(得分:3)
看起来这里的问题是你期望将返回的值及时附加到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);
}
答案 1 :(得分:0)
不确定是不是问题,但对于POST来说不应该是这样吗?
function fill_div(id, count) {
var rend = "";
var filler = $('#'+id);
for(i = 0; i < count; 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);
});
}
}
(不同之处在于'数据'是一个对象,而不是一个字符串)
答案 2 :(得分:0)
执行函数fill_div时,
上有初始化var rend = "";
并且构建POST请求时
'data':"rendered="+rend
rend值将为空
你能仔细检查变量名吗?
:)