jQuery .ajax()回调范围混乱

时间:2011-07-27 02:35:51

标签: javascript jquery callback scope

我在循环中发出请求,尝试累积每次返回的对象的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数据中,但是没有值。我觉得我得到的东西搞砸了范围。

3 个答案:

答案 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值将为空

你能仔细检查变量名吗?

:)