私のアプリケーションはCordovaアプリです。今週、コンソールに多くの警告が表示されました。
Deferred long-running timer task(s) to improve scrolling smoothness. See crbug.com/574343.
今週まで見たことがない。一部のプロセスは非常に大きく、そのためユーザーにその処理をレンダリングしないため、私は多くのsettimeoutを使用します。
// GETS MEDICINES VIA MYCLOUD
function getMedicinesFromServer() {
// Start Process
myProcess("Syncing Medicines", true);
setTimeout(function () {
var data = getAllModifiedMedicines(viewModel.MedicineCupboard());
sendAllMedicines(data);
}, 300);
}
これは誤検知ですか、それともより良い方法がありますか。
これらのばかげたタイムアウトの完全な理由は、ユーザーがボタンをクリックしてデータをプッシュアップしたときにユーザーが認識できるようにするためです。
古い方法:
myProcess("Syncing Medicines", true);
var data = getAllModifiedMedicines(viewModel.MedicineCupboard());
sendAllMedicines(data);
プロセスをユーザーにレンダリングすることを保証しませんでした。
警告は、タイマーが時間どおりに起動されなかったことを示しています。これは、長時間実行されるコールバック(> 50ms)であり、ユーザーがスクロールしようとしていたためです。コールバックの実行中、Chromeはページのスクロールを開始できないため、ユーザー入力がタイムリーに処理されない「ジャンク」が発生します。ユーザーのエクスペリエンスを向上させるために、 Chromeは、コールバックの実行がユーザーに悪影響を及ぼさない時間まで、そのコールバックの起動を延期することを決定しました。
あなたがやろうとしていることの詳細はわかりませんが、物事を行う正しい方法は、1つの大きなコールバックを小さなバッチにまとめて分散し、1回の呼び出しでユーザーの操作が著しく遅れないようにすることです。 。さらに、 requestIdleCallback の使用を検討することもできます。これは、Chromeがアイドル状態であり、タイムクリティカルでないタスクに最適な場合にのみ関数を呼び出します(ただし、requestIdleCallbackはサポートされています)。 Chrome)のみ。