Я полагаю, что разработчики веб-интерфейса более или менее сталкивались с проблемами дросселирования и анти-тряски. Дросселирование функций и функция защиты от встряхивания, обе из которых являются средствами оптимизации эффективности выполнения кода. В определенный период времени количество выполнений кода не обязательно должно быть чем больше, тем лучше. Наоборот, частое срабатывание или выполнение кода вызовет большое количество перерисовок и других проблем, влияющих на ресурсы браузера или компьютера. Поэтому количество раз выполнения кода контролируется в разумных пределах. Он может не только сэкономить ресурсы процессора браузера, но и сделать просмотр страниц более плавным, и не будет зависать из-за выполнения js. Это то, что делают регулирование функции и функция подавления дребезга.
В приложении для управления грузовыми авиаперевозками, которое я недавно разработал для внутренней авиакомпании, я просто использовал идею дросселирования и защиты от сотрясений, чтобы оптимизировать процесс.
Троттлинг и защита от тряски
Функция Throttle обращается к методам JS только один раз в определенный период времени. Например, моргание людей — это определенное время.
Функция anti-shake означает, что в случае частого срабатывания, только при достаточном простое, код выполняется однократно. Например, в жизни поездка на автобусе означает, что в течение определенного периода времени, если люди будут проводить карты одну за другой, чтобы сесть в автобус, водитель не будет водить машину. Водитель сядет за руль только в том случае, если никто другой не украл карту.
Флаттер дроссель
Функция дросселирования, поместите ее просто, состоит в том, чтобы сделать непрерывную функцию нельзя вызывать в течение очень короткого интервала времени, только когда последняя функция выполняется через указанный интервал времени, вы можете для следующего вызова функции.
Поместите это в функцию фестиваля бизнес-анализа:
class MyStatefulWidgetState extends State<OrderPageEdit> {
bool canScanning; //是否可以扫描
//扫描控制流
final Stream<dynamic> _barScanner =
EventChannel('com.freshport.freshport/barcode').receiveBroadcastStream();
StreamSubscription<dynamic> _barScannerSubscription;
@override
void initState() {
super.initState();
_barScannerSubscription = _barScanner.listen((data) {
if (!canScanning) return;
setState(() {
canScanning = false;
});
scanning(data);
});
}
@override
void dispose() {
_barScannerSubscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Widget;
}
//扫面获取
scanning(goodsCode) async {
final result = await fetch.fetch(url: 'www.nicai.com');
setState(() {
canScanning = true;
});
if (result.result) {
} else {}
}
}
Объясните этот код, потому что этот проект представляет собой сканирование штрих-кода для работы с товарами, мы ожидаем однократного сканирования, считывания из базы данных в список товаров. Поэтому, даже если скан не может быть прочитан до этого. Так что я_barScanner
В функции прослушивания добавьте флаг флаг, чтобы определить, используется ли он, чтобы определить, завершен ли чтение, установите флаг.true
. На этом этапе вы можете продолжить сканирование.
Конечно, у моей функции троттлинга нет явного не срабатывающего времени, как у некоторых функций перехвата, не срабатывающее время этой функции — это время загрузки.
Противоскользящий
Определение функции защиты от сотрясения состоит в том, что после того, как событие запускается несколько раз, обработчик события выполняется только один раз и выполняется, когда операция триггера завершается. Принцип заключается в выполнении операции задержки над функцией обработки.Если событие запускается снова до наступления установленной задержки, таймер последней операции задержки будет очищен, и таймер будет переустановлен.
Функция Anti-Shake в основном используется для обработки поиска в режиме реального времени, перетаскивания и входа в систему имена пользователя и проверки формата паролей. В среде JS мы обычно используем Settimeate Function Function для обработки анти-встряхивания. Тот же принцип, в трепетании, мы принципием функции времени (или вызовите функцию задержки для обработки).
В постоянном поиске, соответствующем полю ввода, я использовал обработку против сотрясений:
class MyStatefulWidgetState extends State<GoodsCodeList> {
//检索输入
final TextEditingController _textController = TextEditingController();
//设置防抖周期为3s
Duration durationTime = Duration(seconds: 3);
Timer timer;
@override
void initState() {
super.initState();
}
@override
void dispose() {
_textController.clear();
timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return TextField(
controller: _textController,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(5.0),
hintText: "请输入商品编码",
prefixIcon: Icon(Icons.search, color: Colors.black),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
border:
OutlineInputBorder(borderRadius: BorderRadius.circular(3.0))),
onChanged: (String text) {
//限制加节流
if (text.trim().length < 5) return;
setState(() {
timer?.cancel();
timer = new Timer(durationTime, () {
//搜索函数
});
});
});
}
}
Как показано в коде, сначала установитеTimerобъекта, когда поле вводаTextFieldПри непрерывном вводе он всегда срабатываетTimerобъектcancelсобытие, как отмененное, так и повторноеTimerНазначить новый период3sфункция синхронизации. когда3sКогда в середине не вводится никакой информации, срабатывает эта функция синхронизации. но через три секундыповторно войти, эта временная функция будет снова отменена, и в качестве нового периода будет назначен новый период.3sфункция синхронизации.
Это практическое применение функции защиты от сотрясений.
окончание
Мы часто сталкиваемся с регулированием функций и защитой от сотрясения в коде js, потому что в js операции DOM (onresize, onscroll и т. д.) являются наиболее требовательными к производительности, но в некоторых сценариях одно и то же событие будет запускаться несколько раз. для уменьшения работы есть концепция анти-тряски и дросселирования. На самом деле, во многих разработках мы все еще можем использовать анти-тряску и дросселирование, чтобы уменьшить количество ненужных операций и ajax-запросов.