Я бы порекомендовал разбить его и повторить с setTimeout.
Например, вместо:
function example1() {
for (var i = 0; i < 1000; i++) {
// SOME CODE
}
}
Вы можете написать:
function example2() {
var i = 0;
helper();
function helper() {
// SOME CODE
if (++i < 1000) {
setTimeout(helper, 0);
}
}
}
Вам не нужно иметь каждую итерацию в другом обратном вызове. Вы можете преобразовать 1000 итераций в 1 вызове функции в 10 итераций на вызов функции в 100 вызовах функций или что-то более подходящее в вашем случае. Идея состоит в том, чтобы не блокировать пользовательский интерфейс так долго, чтобы пользователь это заметил.
Другой идеей было бы использовать Web Workers, если вы можете, но это не будет работать в старых браузерах (что может быть или не быть проблемой для вас, если вы пишете расширение для браузера или знаете, что будут использовать ваши пользователи) и т. д.).
Если вы сделаете это так, как объяснили в своем вопросе, то вы сделаете браузер полностью не отвечающим во время ваших расчетов и, скорее всего, вызовете «медленный сценарий - хотите ли вы его убить?» вид предупреждения.