JQuery Ajax с асинхронным ложным зависает Firefox - PullRequest
3 голосов
/ 15 ноября 2010

У меня есть код, который вызывает $ .ajax, например:

$.ajax({

                        type: "POST",
                        url: "/sandbox/graphloader/mock3",
                        async: false,
                        data: {calInput1:dates[0], calInput2:dates[1]},
                        success: function(data){
                            data=eval(data);
                            for(var x in data[0]){
                                //alert(data[0][x]);
                                //fill columns here;
                            }

                            fillPercents(column);
                        }});

Теперь это работает во всех браузерах, кроме Firefox. firebug показывает, что получает ответ от поста, но при неизвестной ошибке не отображает данные. В чем может быть проблема?

Ответы [ 3 ]

10 голосов
/ 15 ноября 2010

Такое поведение задуманно.

Никогда использовать async: false.
Поскольку Javascript запускается в потоке пользовательского интерфейса, запрос async: false остановит браузер до тех пор, пока сервер не ответит.

1 голос
/ 29 февраля 2012

Замораживает, потому что не получает ответ «успех», и вы не обработали ошибку. Установите error: function(jqXHR, textStatus, errorThrown){} в ваших настройках для обработки ответа об ошибке. async: false отлично работает.

0 голосов
/ 17 ноября 2010

Ваш глобальный columns может быть перезаписан предыдущим AJAX-запросом.

Попробуйте сделать его локальной переменной в обратном вызове и попробуйте добавить вызовы console.log, чтобы убедиться, что порядок обратного вызова соответствуетожидайте.


Возможно, вам потребуется сохранить глобальный счетчик запросов, чтобы гарантировать, что вы не обработаете ответ после отправки нового запроса.

Например:

var lastRequest = 0;   //You may want to put this in a namespace or closure

...

var thisRequest = ++lastRequest;
$.ajax({
    type: "POST",
    url: "/sandbox/graphloader/mock3",
    async: false,
    data: {calInput1:dates[0], calInput2:dates[1]},
    success: function(data){
        if (thisRequest !== lastRequest) return;
        ...
    }});

Не делайте этого внутри тела цикла, иначе вы будете использовать переменную thisRequest.
Вместо этого вызовите функцию из тела цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...