Только в ограниченной степени. Если дорогая операция происходит в той же среде Javascript, ресурсы этой среды будут использованы дорогой операцией, независимо от того, выполняется ли дорогая операция синхронно или асинхронно (например, после Promise.resolve
). Например, пользователь может не иметь возможности взаимодействовать со страницей во время выполнения операции.
Вместо этого используйте сервисного работника, чтобы дорогостоящие операции выполнялись в совершенно отдельной среде, позволяя исходной странице бытьвзаимодействовал как обычно. Например:
const workerFn = () => {
// something expensive
while (true) {
}
};
const workerFnStr = `(${workerFn})();`;
const blob = new Blob([workerFnStr], { type: 'text/javascript' });
const worker = new Worker(window.URL.createObjectURL(blob));
button.onclick = () => console.log('clicked');
body {
height: 1000px;
}
<button id="button">click</button>
Рабочий там будет потреблять МНОГО ресурсов, но исходное окно останется прокручиваемым и интерактивным по желанию. Без работника вам пришлось бы либо жить с неподходящим исходным окном во время выполнения дорогостоящей операции, либо разбивать дорогостоящую операцию на несколько недорогих блоков, которые называются, например, каждые 100 мс. (хотя, даже используя этот метод, окно может быть не таким отзывчивым, как хотелось бы - лучше использовать рабочий)