IE7 зависает при использовании (многим) вызовов ajax с async: false - PullRequest
0 голосов
/ 29 июня 2010

У меня есть следующая функция в гораздо большем скрипте, который загружает переводы из php-файла:

function loadLanguages(language){
 var data = new Object();
 data.language = language;
 var dataString = $.toJSON(data);
 var langSt = $.ajax({
  url: "/VID/ajax/loadtranslations.php",
  data: ({data: dataString}),
  async: false
 }).responseText;
 var languageArr = $.evalJSON(langSt);
 return languageArr;
}

Работает в FF, но в IE7 и IE8 браузер зависает. Когда я закомментируюAjax-вызов в функции IE не зависает.Если я установлю async: true, функция больше не будет работать, но браузеры не будут зависать.Только если я установлю async в false, IE будет зависать.Я немного озадачен почему!

Ответы [ 2 ]

4 голосов
/ 29 июня 2010

Вы никогда не должны использовать async: false; браузер всегда будет зависать, пока запрос не завершится.

Это необходимое следствие того факта, что Javascript является однопоточным и никогда не изменится.

1 голос
/ 29 июня 2010

Редактировать Извините, вы действительно имели в виду повесить (что вы сказали);Я и другие просто радостно читаем block .

Я заметил, что вы используете responseText объекта XMLHttpRequest, возвращенного $.ajax напрямую.Я думаю, что даже с синхронным запросом я бы все еще использовал обратный вызов:

function loadLanguages(language){
    var data = new Object();
    data.language = language;
    var dataString = $.toJSON(data);
    var languageArr = /* ...some appropriate default value if the request fails... */;
    $.ajax({
        url: "/VID/ajax/loadtranslations.php",
        data: ({data: dataString}),
        async: false,
        success: function(langSt) {
            languageArr = $.evalJSON(langSt);
        }
    });
    return languageArr;
}

Старый ответ:

Когда вы используете синхронный Ajax-запрос, на многихбраузеры (не только IE), пользовательский интерфейс становится полностью не отвечает во время запроса.В IE это особенно плохо, потому что это не просто ваша страница, а весь процесс браузера 1020 *, который заканчивается ожиданием - пользователь даже не может выйти и сделать что-то еще в другой вкладке.

Это, мягко говоря, приводит к ухудшению взаимодействия с пользователем.

Это происходит потому, что на данный момент JavaScript в веб-браузерах является однопоточным, а во многих браузерах этот поток является потоком пользовательского интерфейса.Даже в приложениях, не основанных на браузере, привязка потока пользовательского интерфейса для обработки без пользовательского интерфейса не идеальна.

Поэтому вы хотите избегать использования синхронных запросов ajax всякий раз, когда это возможно, и это почти всегда возможно (возможно, даже *).1027 * всегда возможно).Это включает в себя некоторый рефакторинг в вашем подходе, когда функция «А» запускает что-то, что позже завершается функцией «В» (вызов «успеха» при вызове ajax), но выполняет этот рефакторинг (а затем использует этот образ мышления в своем проектебудущее) значительно улучшает взаимодействие с пользователем.

До тех пор, пока веб-работники не будут широко внедрены, вам нужно экономно использовать этот единственный поток JavaScript и мыслить с точки зрения событий и обратных вызовов.Я обнаружил, что принуждение к этому в конечном итоге действительно улучшает мой код и меняет мой подход к другим средам в лучшую сторону.

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