ブラウザはスクリプトを同期して実行します。ロングタスクが実行されているときにページを更新するには、長時間実行される同期コードを分割し、これらの処理の間にブラウザに制御を委譲する必要があります。これは、一連のタスクをチャンクに分割し、ブラウザに制御を戻す遅延を制御する必要があることを意味します。
これを行う方法を提供するスニペットがあります。パフォーマンスはそれほど素晴らしいわけではありませんが、これはstackoverflowの埋め込みスクリプトランナーの実装が遅いためです(console.log
)。ブラウザの実際のコンソールでこのコードを使用してみてください。パフォーマンスは素晴らしいです!
function doHeavyTask(params) {
var totalMillisAllotted = params.totalMillisAllotted;
var totalTasks = params.totalTasks;
var tasksPerTick = params.tasksPerTick;
var tasksCompleted = 0;
var totalTicks = Math.ceil(totalTasks/tasksPerTick);
var interval = null;
if (totalTicks === 0) return;
var doTick = function() {
var totalByEndOfTick = Math.min(tasksCompleted + tasksPerTick, totalTasks);
do {
params.task(tasksCompleted++);
} while(tasksCompleted < totalByEndOfTick);
if (tasksCompleted >= totalTasks) clearInterval(interval);
};
// Tick once immediately, and then as many times as needed using setInterval
doTick();
if (totalTicks > 1) interval = setInterval(doTick, totalMillisAllotted/totalTicks);
}
// Do 10,000 console.logs, in chunks of 100, within 5 seconds
doHeavyTask({
totalMillisAllotted: 5 * 1000,
totalTasks: 10000,
tasksPerTick: 100,
task: function(n) { console.log(n + 1); }
});
? Javascriptは多くの異なる場所で実行され、 'consoleの実装はさまざまです。log' –
クロムデベロッパーツールを開き、コンソールに切り替え、そのコードを、???、利益に貼り付けてください! – imjared
私は、何らかの起動遅延がある環境で作業していると感じています。たとえロギングが完了する前にループが完全に実行されたとしても、わずか10万の反復で検出可能な時間がかかりません。 –