Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибки при асинхронных AJAX запросах (https://javascript.ru/forum/misc/46075-oshibki-pri-asinkhronnykh-ajax-zaprosakh.html)

San4ezy 26.03.2014 23:15

Ошибки при асинхронных AJAX запросах
 
Доброго времени суток!

Выявил странную ошибку, на странице производится 3 запроса к серверу методом $.ajax(). Сервер отдает все 3 ответа, но при этом колбек срабатывает только одного запроса, остальные генерят ошибки.

$(document).ready(function(){
            $.when(
                getRequest('GetProjectTypes', '', function(data){
                    alert('1');
                }),
                getRequest('GetTasksTable', 'project_type=2', function(data){
                    alert('2');
                }),
                getRequest('GetGroupUsers', 'group_id=1', function(data){
                    alert('3');
                })
            ).then(function(){alert("Done");});
        });


getRequest - функция, которая собственно и реализует запросы к серверу:

function getJSONP(url, callback, success){
    $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonpCallback: callback,
        success: success,
        error: function(r, m, e){
            alert(e);
        }
    });
}

function getRequest(method, vars, success){
    getJSONP(
        'http://127.0.0.1:8000/test_api/' + method + '/?' + vars, 
        'callback_function', 
        function(data){
            if(data['status'] == 'ok'){
                success(data);
            }else{
                alert(data['data']);
            }
        }
    );
}


При загрузке страницы появляется алерт "Done", а затем алерт "2". При этом первый и третий запросы выдают ошибки "TypeError: callback_function is not a function" и "Error: callback_function was not called". Сервер на все запросы возвращает status: 200 и данные в виде "callback_function(<JSON>);". JSON валидный, проверял на jsonlint.
Почему возникают ошибки? Помогите исправить.

PS: Добавлю, что первый и третий запрос выполняются за 30-60 мс, а второй - за 2,5 с. Возможно это влияет на результат? Но если я правильно понимаю, то смысл метода when заключается в том, чтобы дождаться выполнения всех асинхронных запросов?

Заранее благодарен за помощь!

dmitriymar 26.03.2014 23:26

А перевести сообщения об ошибках не? По русски ведь написанно что у вас нет функции callback-function. Функции в какую обарачиваете ответ не существует

San4ezy 26.03.2014 23:41

С ошибками как раз все понятно. Не понятен был момент, почему функция не существует, если имя в jsonpCallback и имя возвращаемой сервером функции совпадает и по отдельности все 3 запроса работают без ошибок.
Проблема в том, что во всех запросах используется одно имя колбек-функции, соответственно они друг друга переопределяют и выполняется только та, которая создалась последней (второй запрос выполняется дольше всех).
Заменил имена функций на уникальные и все заработало.
Спасибо за наводку!

dmitriymar 27.03.2014 09:10

Цитата:

Сообщение от San4ezy
jsonpCallback и имя возвращаемой сервером функции совпадает

А причём совпадение имён в отправке и возврате обёртки к наличию функции с данным именем?

San4ezy 27.03.2014 21:48

Совпадение имен при том, что если сервер отдаст функцию с другим именем, то получим ошибку. Я не вникал в технические подробности, но проверил это практически. К первоначальной проблеме это действительно не относится. Как я и написал выше, проблема решается уникальными именами колбек-функций. Если я в чем-то не прав, прошу указать на ошибки.


Часовой пояс GMT +3, время: 09:33.