Конечно, веб-работники могли бы пойти по этому пути.Но для браузеров, которые не поддерживают веб-работников (IE <10), есть запасной подход: </p>
Если ваш код синхронен, он заморозит браузер во время его работы.Однако, если вы можете разделить свою обработку на части приличного размера, вы можете разбить ее на части, достаточные для того, чтобы браузер мог реагировать на взаимодействие с пользователем.
Итак, этот код:
for (var i = 0; i < data.length; i++) {
processData(data[i]);
}
Получается так:
var i = 0;
(function processNext() {
if (i < data.length) {
processData(data[i++]);
setTimout(processNext, 0);
}
})();
Это не идеально - если processData()
делает слишком много, пользовательский интерфейс все равно будет неприемлемо не отвечать.С другой стороны, если это не очень много, это может сильно замедлить обработку данных.В последнем случае вы можете обрабатывать определенное количество итераций за раз перед вызовом setTimeout:
var i = 0;
(function processNext() {
if (i < data.length) {
for (var stop = i + 100; i < stop && i < data.length; i++) {
processData(data[i]);
}
setTimout(processNext, 0);
}
})();