web-dev-qa-db-ja.com

私が受け取り続けるこのコンソール警告は何ですか-スクロールのスムーズさを改善するために長時間実行されるタイマータスクを延期しましたか?

私のアプリケーションは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);

プロセスをユーザーにレンダリングすることを保証しませんでした。

9
tyler_mitchell

警告は、タイマーが時間どおりに起動されなかったことを示しています。これは、長時間実行されるコールバック(> 50ms)であり、ユーザーがスクロールしようとしていたためです。コールバックの実行中、Chromeはページのスクロールを開始できないため、ユーザー入力がタイムリーに処理されない「ジャンク」が発生します。ユーザーのエクスペリエンスを向上させるために、 Chromeは、コールバックの実行がユーザーに悪影響を及ぼさない時間まで、そのコールバックの起動を延期することを決定しました。

あなたがやろうとしていることの詳細はわかりませんが、物事を行う正しい方法は、1つの大きなコールバックを小さなバッチにまとめて分散し、1回の呼び出しでユーザーの操作が著しく遅れないようにすることです。 。さらに、 requestIdleCallback の使用を検討することもできます。これは、Chromeがアイドル状態であり、タイムクリティカルでないタスクに最適な場合にのみ関数を呼び出します(ただし、requestIdleCallbackはサポートされています)。 Chrome)のみ。

12
David Bokan