Превышено время ожидания выполнения JavaScript в iOS 5 Safari - PullRequest
5 голосов
/ 24 октября 2011

Я работаю над мобильным веб-приложением, которое в основном автономно и связывается с сервером только при необходимости. В настоящее время используются следующие библиотеки:

  • jQuery 1.6.4
  • jQuery UI 1.8.3
  • Модифицированная / исправленная версия jQTouch

Вплоть до выхода iOS 5 мы также использовали touchscroll.js, но он больше не нужен, поскольку Safari теперь поддерживает положение: фиксированная и встроенная прокрутка.

Начиная с выпуска iOS 5, казалось бы, наугад, возникает это исключение:

JavaScript: Error undefined JavaScript execution exceeded timeout

Как только оно поднято, Safari не будет выполнять JS-код, который выполняется в течение более очень короткого промежутка времени (скажем, 1 мс). Обновление страницы, переход на новую страницу или переход на новый домен не имеет никакого эффекта. Любой код JS, даже такой простой, как

for(var i = 0; i < 30; i++) ;

не будет выполняться браузером без возбуждаемого исключения. Единственный способ обойти это - принудительно убить Safari и перезапустить его. Я полагаю, что также возможно обернуть любой удаленный «тяжелый» код в приложении в window.setTimeout (..., 1) или использовать Web Workers для всего, кроме обновлений пользовательского интерфейса, но это не очень Хорошее решение, так как приложение довольно большое и потребует существенного переписывания.

Кто-нибудь сталкивался с этой проблемой раньше? Как бы вы пошли на отладку чего-то подобного, так как это не какой-то фрагмент кода, который, кажется, переводит Safari в это сломанное состояние, и это может произойти на первый взгляд случайно?

Я попытался выяснить время ожидания движка JS в мобильном Safari, выполнив следующие действия:

var start, end;
start = new Date();

try {
   while(true);
} catch (ex) {
  alert('test');
}

end = new Date();
console.log(Number(end) - Number(start) + 'ms');

К сожалению, это исключение тайм-аута не является исключением JS, поэтому его нельзя перехватить в блоке try / catch; однако кажется, что максимальный период ожидания составляет несколько секунд. Ни один из кода в нашем приложении не блокирует браузер / JS-движок на долгое время (так как он обеспечил бы ужасный UX), и большинство, если не все, вероятно, имеют время выполнения менее 300 мс (включая все, что является «сверхмощным»).

1 Ответ

0 голосов
/ 25 октября 2011

Вы используете watchPosition?посмотрите этот ответ, если это так: Выполнение JavaScript превысило время ожидания

С тех пор, как вышла iOS 5, я ломал голову над этой проблемой - я чувствую вашу боль!

...