jQuery .ajax () беспорядок в области обратного вызова - PullRequest
1 голос
/ 27 июля 2011

Я делаю запросы в цикле, пытаясь накапливать идентификаторы объектов, возвращаемых каждый раз, и отправлять последующим запросам, чтобы они не возвращались во второй раз. Однако переменная аккумулятора (очевидно) находится за пределами .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, переменная присутствует в данных поста, но не имеет значения. Мне кажется, что я что-то напутал с областью видимости.

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Похоже, проблема здесь в том, что вы ожидаете, что возвращаемые значения будут добавлены в строку 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);
}
0 голосов
/ 27 июля 2011

при выполнении функции fill_div инициализация на

var rend = "";

и когда запрос POST построен,

'data':"rendered="+rend

значение разрыва будет пустым

Можете ли вы дважды проверить имя переменной?

:)

0 голосов
/ 27 июля 2011

Не уверен, что это проблема, но разве не должно быть так для 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);
                });
    }
}

(разница в том, что «данные» - это объект, а не строка)

...