我的应用程序是Cordova应用程序。本周我在我的控制台中看到了很多警告:
Deferred long-running timer task(s) to improve scrolling smoothness. See crbug.com/574343.
本周之前从未见过它。我确实使用了很多settimeouts,因为有些进程非常大,因此不会向用户呈现其处理过程。
// 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);
不保证向用户呈现该过程。
答案 0 :(得分:12)
警告告诉您,您的计时器未按时触发,因为它是一个长时间运行的回调(> 50ms)并且用户正在/即将滚动。当您的回调正在运行时,Chrome无法开始滚动页面,因此会导致“jank”,用户输入无法及时处理。为了让用户获得更好的体验,Chrome决定推迟触发该回调,直到运行该回调不会对用户造成负面影响。
我不知道你要做什么的细节,但正确的做法是将你的一个大回调分成小批量并将它们分散出去,这样任何一个电话都不会明显延迟用户操作。您还可以使用requestIdleCallback来查看仅在Chrome处于空闲状态时调用您的函数,并且非常适合非时间关键任务。 (但是,截至目前,仅在Chrome上支持requestIdleCallback。)