Я имел дело с этим раньше во внутреннем приложении, где им было все равно, сколько времени браузеру понадобилось для обработки чисел, они просто не хотели нажимать на подсказку.
Ключ состоит в том, чтобы разбить работу на относительно предсказуемые части работы (предсказуемые с точки зрения времени процессора) и запустить их на setInterval, например:
function doWork(begin, end) {
// Some chunk of what your worker function normally does from begin to end
if (actualEnd < end) // Nothing left to do
clearInterval(Interval);
}
var Interval = setInterval(doWork, 15);
Это предотвращает появление приглашения IE (или Chrome не отображает диалоговое окно «Freeze»). Следующим шагом является добавление кода, который позволяет пользователю полностью его пропустить; если объем работы известен в начале, спросите их сразу. Если нет, начните обработку и после n кусков спросите их, хотели бы они выполнить более дешевую функцию.
Есть еще 2 варианта выполнения этой большой работы:
- Посмотрите вперед, сколько работы еще предстоит сделать, и, если это много, передайте ее на сервер (это, к сожалению, означает повторную запись вашего JS на сервер; конечно, вы можете использовать серверный движок, который работает Javascript, чтобы сэкономить немного кода).
- Использование фоновых рабочих из Google Gears / HTML5
Наконец, если вы выполняете такую большую работу по требованию, возможно, у вас есть возможности для ускорения выполняемой работы - данные могут быть предварительно проиндексированы на сервере, чтобы сделать вычисления быстрее / проще, и тому подобное. , Но я не знаю, что вы рассчитываете.